全部博文(512)
分类:
2006-08-22 10:51:41
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
不同的一个具体工厂创建不同的产品,可理解为产品线。注意这里的不同产品,是有限定的。就是他必须属于一个事先指定的产品集合,通常情况下是在最高层的接口内定义的。那么不同体现在哪里呢?一则体现则客户使用工厂生产的产品的数量、种类上的不同,更重要的是某个具体产品不同,可理解为实现机制、流程的不同、创造环境等的不同。也可理解为特征属性的不同。比如联想电脑,在中国工厂的生产就要按照中国的市场环境和生产条件进行,在美国的工厂也许会有另一个情形。
什么是一系列对象,我们不妨理解为一个产品集合。而按照该模式的实现特点,是一个产品,对应一个方法创建(一般是factory method),如此一来,就限制了模式的扩展,如果新增加一个产品,则不仅要修改抽象接口还要修改具体实现类。一些列产品的含义,我的理解是经常情况下该集合内的具体产品能组合成一个大的产品,比如可用一个工厂类表示联想电脑的创建,当其内的元素则是具体的部件产品,比如CPU。当然有时候集合未必有这样清楚地语义信息,可能仅是诸多产品的一个集合。
在面向对象中,经常用到new创建对象,但是显然这样操作要受到类型的限制(new 需要类型),而且是针对实现的编程。目前还有一种创建策略,就是Abstract factory。他不但使得客户部在依赖具体类型,而且是针对接口的编程。
实现:定义一个factory抽象接口,建立每个产品的抽象接口函数。然后根据具体的需要,根据该抽象接口实现一个具体的类,在具体类内要具体实现所需产品的创建。最后客户端调用即可。
举例:联想电脑生产
1、首先定义抽象接口
Class LenovComputerFactory
{
virtual MainBord* CreateMainBord() =0;
virtual CPU* CreateCPU()=0;
virtual Disk *CreateDisk()=0;
virtual Display * CreateDispay()=0;
}
2、分别定两个具体工厂
class ChinaFactory :public LenovComputerFactory
{
//函数实现略
}
class AmericanFactory :public LenovComputerFactory
{
//函数实现略
}
3客户使用
LenovComputer* pFactory = new ChinaFactory();
MainBord *bord = pFactory->CreateMainBord();
CPU *cpu = pFactory->CreateCPU();