工厂方法模式与抽象工厂模式

来源:互联网 发布:生命之花 伤感网络歌曲 编辑:程序博客网 时间:2024/06/05 20:57

这篇博客主要记录一下工厂方法模式和抽象工厂模式。


工厂方法模式比较常见,且相对比较容易理解,
因此直接介绍一下它的定义及设计结构。

工厂方法模式定义了一个创建对象的接口,
但由子类决定实例化的类是哪一个。
工厂方法让类把实例化推迟到子类。

如图所示,抽象的Creator提供了一个创建对象的接口factoryMethod。
在抽象的Creator中,任何其它的方法,例如anOperation,都可能使用到factoryMethod制造出的产品Product。
但Product的具体类型,由Creator的子类ConcreteCreator来决定。
ConcreteCreator负责创建一个或多个具体产品。

所有的产品都必须实现共同的接口Product(设计模式中的接口,包括抽象类和通常意义的接口)。
这样,使用产品的类就可以引用Product接口,而不是具体的类。

使用工厂方法模式的好处是,将产品的“实现”与“使用”解耦。
如果增加产品或者改变产品的实现,使用Creator的客户端代码不会受到影响。


以Head First中的场景为例:

PizzaStore是创建Pizza的抽象父类,Pizza是实际产品的抽象父类。

NYPizzaStore和ChicagoPizzatore是实际创建Pizza的类,
可以分别创建出NYStyleCheesePizza和ChicagoStyleCheesePizza。

在这种设计结构下,可以写出类似如下的代码:

............PizzaStore nyStore = new NYPizzaStore();PizzaStore chicagoStore = new ChicagoPizzaStore();Pizza nyPizza = nyStore.createPizza();Pizza chicagoPizza = chicagoStore.createPizza();............

用户只需要知道最后得到的是Pizza类,
并不需要知道NYPizzaStore和ChicagoPizzaStore创建Pizza的细节,
以及Pizza的实际类型。

这就为未来的变化,留有很大的余地。


在了解工厂方法模式后,我们再来看看抽象工厂模式。

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,
而不需要明确指定具体类。

如上图所示,客户端Client只需要和抽象的工厂AbstractFactory打交道,
得到抽象的产品AbstractProductA和AbstractProductB。

客户不需要知道实际产出的具体产品是什么,
这就到达了将客户从具体的产品中解耦的目的。

抽象工厂AbstractFactory定义了一组接口,用于创建一系列相关的产品族。
所有具体的工厂都必须实现AbstractFactory中定义的接口,以生产实际的产品。

例如,图中的一族产品包括ProductA和ProductB。
ConcreteFactory1和ConcreteFactory2均具有生产整个产品族的能力。

从上图可以看出,AbstractFactory仍然将创建具体对象的任务延迟到其子类完成,
由此可以得到,抽象工厂模式实际上也应用了工厂方法模式。


在文章的最后,做一下总结:
工厂方法模式,其实就是通过子类来创建对象。
用这种做法,客户只需要知道他们所使用的抽象类型就可以了,
而由工厂的子类来负责决定具体的类型。

抽象工厂模式,主要提供用来创建整个产品家族的抽象类型。
这个类型的子类定义了产品族中每个产品的生产方法。

0 0
原创粉丝点击