【C++ Desgin Pattern-Creational】Abstract Factory (抽象工厂)

------文章编辑参考机械工业出版社《设计模式 可复用面向对象软件的基础》

模型目的:

提供一个创建一系列相关或相互依赖的对象的接口,而无需指定其具体的类

------------------------------------

可以解释为:提供一个制造一系列对象的对象(工厂实例),使得创建对象的过程得以封装。

(这也是一系列创建型模式(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.csdn.net/logsharp/article/details/1726024

------------------------------------------------------------------------------------------------------------------------------------------------------------------

-2012/2/4

经过阅读几份博文,我认为在抽象工厂类似于工厂方法的升级。

毕竟抽象工厂是对应于创建一个系列的产品,而工厂方法是对应创建一种产品。当然在《设计模式》里面也提及到抽象工厂的实现一般使用工厂方法。

对于抽象工厂而言,我觉得最大问题在于增加产品的时候如何解决开闭原则的问题。

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值