工厂 > 工厂方法模式

来源:互联网 发布:淘宝小果澳洲代购 编辑:程序博客网 时间:2024/06/09 23:54

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

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

该模式下的类图:

这里写图片描述

以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 设计模式》

0 0
原创粉丝点击