目录
结构
案例
类图
代码实现
抽象咖啡工厂
美式咖啡工厂
拿铁咖啡工厂
咖啡类(抽象产品类)
美式咖啡
拿铁咖啡
咖啡店类
测试类
优缺点
优点
缺点
结构
工厂方法模式的主要角色:
-
抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
-
具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
-
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
-
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
案例
需求:设计一个咖啡店点餐系统。
类图
代码实现
抽象咖啡工厂
package factory_method;
/**
* @author: ZQH
* @project: Design Pattern
* @description 咖啡工厂
* @date: 2023/7/18 16:27
*/
public interface CoffeeFactory {
// 创建咖啡对象
Coffee createCoffee();
}
美式咖啡工厂
package factory_method;
/**
* @author: ZQH
* @project: Design Pattern
* @description 美式咖啡工厂
* @date: 2023/7/18 16:29
*/
public class AmericanCoffeeFactory implements CoffeeFactory {
@Override
public Coffee createCoffee() {
return new AmericanCoffee();
}
}
拿铁咖啡工厂
package factory_method;
/**
* @author: ZQH
* @project: Design Pattern
* @description 拿铁咖啡工厂
* @date: 2023/7/18 16:31
*/
public class LatterCoffeeFactory implements CoffeeFactory{
@Override
public Coffee createCoffee() {
return new LatteCoffee();
}
}
咖啡类(抽象产品类)
package factory_method;
/**
* @author: ZQH
* @project: Design Pattern
* @description 咖啡类
* @date: 2023/7/18 14:43
*/
public abstract class Coffee {
public abstract String getName();
public void addMilk(){System.out.println("加奶");}
public void addSuger(){
System.out.println("加糖");
}
}
美式咖啡
package factory_method;
/**
* @author: ZQH
* @project: Design Pattern
* @description 美式咖啡
* @date: 2023/7/18 14:47
*/
public class AmericanCoffee extends Coffee{
public String getName(){
return "美式咖啡";
}
}
拿铁咖啡
package factory_method;
/**
* @author: ZQH
* @project: Design Pattern
* @description 拿铁咖啡
* @date: 2023/7/18 14:59
*/
public class LatteCoffee extends Coffee{
public String getName(){
return "拿铁咖啡";
}
}
咖啡店类
package factory_method;
/**
* @author: ZQH
* @project: Design Pattern
* @description 咖啡店类
* @date: 2023/7/18 16:33
*/
public class CoffeeStore {
private CoffeeFactory factory;
// 设置工厂
public void setFactory(CoffeeFactory factory){
this.factory = factory;
}
// 制作咖啡
public Coffee orderCoffee(){
Coffee coffee = factory.createCoffee();
// 加配料
coffee.addMilk();
coffee.addSuger();
return coffee;
}
}
测试类
package factory_method;
/**
* @author: ZQH
* @project: Design Pattern
* @description 测试类
* @date: 2023/7/18 16:38
*/
public class Client {
public static void main(String[] args) {
// 创建美式咖啡工厂对象
CoffeeFactory factory = new AmericanCoffeeFactory();
// 创建咖啡店对象
CoffeeStore store = new CoffeeStore();
// 设置工厂
store.setFactory(factory);
// 点咖啡
Coffee coffee = store.orderCoffee();
System.out.println(coffee.getName());
}
}
优缺点
优点
-
用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
-
在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
缺点
-
每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。