工厂 > 工厂方法模式

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个(子类实现M,完成具体类实例的创建),工厂方法让类把实例化推迟到子类。

所有工厂模式都用来封装对象的创建,工厂方法模式也不例外。工厂方法模式可以分为几个角色类:抽象创建者类(PizzaStore )、抽象创建者的实现类(NYPizzaStore )、抽象产品(Pizza)、抽象产品的实现类(NYStyleCheesePizza等)。

该模式下的类图:

工厂 > 工厂方法模式_第1张图片

以Head First的预定Pizza为例。

1.抽象的创建者(Abstract Factory)

抽象的创建者通常定义一个抽象的工厂方法,该方法返回的是抽象产品,具体产品由子类实现该方法决定。

包含抽象的工厂方法的抽象创建者PizzaStore:

/** * 抽象创建者类,定义了一个抽象的工厂方法,让子类实现此方法制造产品 */
public abstract class PizzaStore {

    public Pizza orderPizza(String type){
        /** * 抽象创建者通常包括依赖抽象产品的代码,而这些抽象产品由子类制作,创建者不需要真的知道在制造哪种具体的产品 */
        Pizza pizza = createPizza(type);
        pizza.prepare();
        return pizza;
    }

    //抽象的工厂方法
    abstract Pizza createPizza(String type);
}

2.抽象创建者的实现类(Concrete Factory)

实现createPizza抽象方法的子类NYPizzaStore :

/** * 能够产生产品的类成为具体创建者 *因为每个加盟店都有自己的PizzaStore子类,所以可以利用实现createPizza()创建自己风味的Pizza */
public class NYPizzaStore extends PizzaStore{

    @Override
    public Pizza createPizza(String type) {
        if("cheese".equals(type)){
            return new NYStyleCheesePizza();
        }else if("clam".equals(type)){
            return new NYStyleClamPizza();
        }
        return null;
    }

}

这个方法的实现有些像简单工厂,但简单工厂会把各种实例的创建封装在工厂类里,然后工厂被提供给客户NYPizzaStore使用。

测试:

public class FactoryMethodTest {
    public static void main(String[] args) {
        PizzaStore nyStore = new NYPizzaStore();
        Pizza nyPizza = nyStore.orderPizza("cheese");
        PizzaStore chicagoStore = new ChicagoPizzaStore();
        Pizza cgoPizza = chicagoStore.orderPizza("cheese");
    }
}

工厂方法让子类决定要实例化的类是哪一个,所谓的决定,不是指模式允许子类本身在运行时做决定,而是指编写创建者类PizzaStore时,
不需要知道实际创建的产品是哪一个,选择了使用哪个子类,自然就决定了实际创建的产品是什么。

工厂模式的好处是帮助我们将产品的“实现”(具体的实现类NYPizzaStore)从“使用”(PizzaStore使用产品)中解耦,
如果增加产品,增加California相关口味的Pizza,那么所有的类都不受影响,只需要增加PizzaStore新的子类CaliforniaPizzaStore实现createPizza方法,并继承Pizza实现California口味的CaliforniaStyleCheesePizza、CaliforniaStyleClamPizza,完全符合“对扩展开放,对修改关闭”的原则。

参考资料:《Head First 设计模式》

你可能感兴趣的:(工厂 > 工厂方法模式)