Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7196121
  • 博文数量: 510
  • 博客积分: 12019
  • 博客等级: 上将
  • 技术积分: 6836
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-01 16:46
文章分类

全部博文(510)

文章存档

2022年(2)

2021年(6)

2020年(59)

2019年(4)

2018年(10)

2017年(5)

2016年(2)

2015年(4)

2014年(4)

2013年(16)

2012年(47)

2011年(65)

2010年(46)

2009年(34)

2008年(52)

2007年(52)

2006年(80)

2005年(22)

分类:

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();

阅读(1526) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~