------文章编辑参考机械工业出版社《设计模式 可复用面向对象软件的基础》
模型目的:
提供一个创建一系列相关或相互依赖的对象的接口,而无需指定其具体的类。
------------------------------------
可以解释为:提供一个制造一系列对象的对象(工厂实例),使得创建对象的过程得以封装。
(这也是一系列创建型模式(Creational DesignPattern)的基本目的)
-----------------------------------
适应性:
①需要将产品创建、组合的过程独立成块并封装的时候。
②需要由多个产品系列中的一个来配置一个系统,并且这一系列里面的产品对象进行联合使用。
③提供一个产品库,只想显示接口而不是实现时。
类模型视图:
关注点:
①使客户与类的实现分离,与对象的创建分离,只需通过接口操纵实例
②易于替换产品系列(更换工厂实例即可)
③有利于产品一致性(当客户使用工厂来创建实例时,该工厂能够创建的全部种类的实例都归属于一个系列)
④难以支持新产品(假如增加新产品,则需要更改整个工厂内部)
(以上的关注点是需要仔细考虑,并且需要解决的技术问题)
⑤有一点值得注意的是:工厂封装了实例的创建过程,这是可变的;而对应的客户通过装载工厂来获取实例的过程是不变得,换言之这也方便于第二点(替换工厂)。
而且这也就是工厂模式的可变与不变的模块关系。
以下图阐述这一观点:
实现及使用技巧:
①将工厂作为单件(Singleton),每组产品系列只需一个工厂实例即可,节省开销。
②可以有多种途径创建产品,
⑴是为每个产品定义一个工厂方法(FactoryMethod)。
⑵具体工厂也可以使用原型(Prototype)来实现,使得不是每一个新产品系列都需要一个新的工厂类。
⑶同样具体工厂也可以使用基于类的技术实现。
(仍未了结如何使用原型来实现工厂,在往下会提供实例)。
③定义可扩展的工厂技术。(http://www.cnblogs.com/happyhippy/archive/2010/09/26/1836223.html这份文章中提及到对于AbstractFactory的扩展是一种类似水平扩展的形式。)
(实例以后补充!)
---------------------------------------------------------------------------------------------------------------------------------------------------------------
根据查阅的资料:
在创建产品时,既是生成客户需要的实例时,有种技术称为IoC(依赖注入)的模式可以使用。
以下为Baidu百科的一段内容:
可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java 的“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。
而以下为C++的依赖注入的一种实现方法,采用Autumn Framework:
http://blog.youkuaiyun.com/logsharp/article/details/1726024
------------------------------------------------------------------------------------------------------------------------------------------------------------------
-2012/2/4
经过阅读几份博文,我认为在抽象工厂类似于工厂方法的升级。
毕竟抽象工厂是对应于创建一个系列的产品,而工厂方法是对应创建一种产品。当然在《设计模式》里面也提及到抽象工厂的实现一般使用工厂方法。
对于抽象工厂而言,我觉得最大问题在于增加产品的时候如何解决开闭原则的问题。