工厂方法模式

80 阅读2分钟

工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。

针对简单工厂模式的缺点,我们使用工厂方法模式来解决

结构

  • 抽象产品——定义产品的规范,描述产品的主要特性和功能。
  • 具体产品——实现或继承抽象产品的子类。
  • 抽象工厂——提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
  • 具体工厂——提供创建产品的方法,调用者通过该方法来获取产品对象。

实现

FactoryCoffee.png

可以看出我们为每个咖啡新加了具体的工厂类

//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();

想喝哪个咖啡,只需要创建对应的咖啡工厂对象即可!

这样就满足了开闭原则,对扩展开放,对修改关闭!

优缺点

优点

用户只需要知道具体化工厂的名称就可以得到所需的产品,无需知道产品的具体创建过程

在系统增加新的产品的时候,只需要添加具体产品类和对应的具体工厂类,无需对原工厂进行任何修改,满足开闭原则

缺点

每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度