工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。
针对简单工厂模式的缺点,我们使用工厂方法模式来解决
结构
- 抽象产品——定义产品的规范,描述产品的主要特性和功能。
- 具体产品——实现或继承抽象产品的子类。
- 抽象工厂——提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
- 具体工厂——提供创建产品的方法,调用者通过该方法来获取产品对象。
实现
可以看出我们为每个咖啡新加了具体的工厂类
//CoffeeFactory.class
public interface CoffeeFactory {
Coffee createCoffee();
}
美式咖啡工厂对象:
//AmericanCoffeeFactory.class
public class AmericanCoffeeFactory implements CoffeeFactory {
public Coffee createCoffee() {
return new AmericanCoffee();
}
}
拿铁咖啡工厂同类,就不再赘述。
在CoffeeStore中配备工厂类
//CoffeeFactory.class
private CoffeeFactory factory;
public void setFactory(CoffeeFactory factory) {
this.factory = factory;
}
//点咖啡功能
public Coffee orderCoffee() {
Coffee coffee = factory.createCoffee();
//加配料
coffee.addMilk();
coffee.addSugar();
return coffee;
}
那么该工厂模式怎么用呢?
//先创建咖啡店对象
CoffeeStore store = new CooffeeStore();
//创建对应的工厂对象
CooffeeFactory factory = new AmericanCoffeeFactor();
store.setFactory(factory);
//点咖啡
store.orderCoffee();
想喝哪个咖啡,只需要创建对应的咖啡工厂对象即可!
这样就满足了开闭原则,对扩展开放,对修改关闭!
优缺点
优点
用户只需要知道具体化工厂的名称就可以得到所需的产品,无需知道产品的具体创建过程
在系统增加新的产品的时候,只需要添加具体产品类和对应的具体工厂类,无需对原工厂进行任何修改,满足开闭原则
缺点
每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度