不同于singleton模式的实现,singleton模式的实现只使用了面向对象概念中的一个封装,也就是封装了构造函数,不对外可见,对外暴露出一个获取唯一实例的方法,并没有利用到面向对象概念中的继承,多态等高级功能。
abstract factory模式说的是抽象工厂,抽象工厂中继承出了两个实际工厂,这两个实际工厂开始生产对象,两个工厂生产出来的对象风格不同,比如游戏开发中,有一个古典物品工厂,一个现代物品工厂,他们都派生与抽象工厂,都实现了创建计算工具这个方法,而古典工厂中的创建计算工具将返回一个算盘,而现代工厂返回的计算工具是一个计算器,古典工厂中创建的商人是一身汉服的店小二,现代工厂创建的商人是一身西装的小老板,这样在实际游戏中先实例化一个古典工厂,就可以依靠古典工厂得到身穿汉服拿着算盘的店小二,或者依靠现代工厂得到身穿西装拿着计算器的小老板,而不会得到一个身穿汉服却拿着计算器的店小二或者身穿西装而抱着算盘的小老板
这样看来,abstract factory模式最主要的是抽象工厂的实例工厂们可以产生一系列相互依赖或相互协调的对象,abstract factory模式存在的意义就是为了创建各系列的对象而存在的。
abstract factory是为了如果加入新系列的对象可以从容应对,可abstract factory难以从容应对创建新的对象,比如这个时候新加入了一个柜台,这个时候就要新加一个柜台基类,再加松木柜台,玻璃柜台,然后还要在抽象工厂中新加创建柜台,在古典工厂中实现创建柜台并返回松木柜台,在现代工厂中实现创建柜台并返回玻璃柜台,这样就很麻烦。
所以abstract factory抽象工厂模式是用来应对系列对象的扩充,而不是新对象类型的扩充,如果一个经常有新对象类型加入的代码环境中应用的抽象工厂,反而是一种很麻烦的事情。
所以我们就可以总结出一条经验:设计模式误用了不如不用,误用了肯定会弄巧成拙。一定要把面向对象的设计里找到变化点,然后封装变化点。设计模式是为了应对变化的。不变的地方千万不能用设计模式。
抽象工厂的下面是系列工厂,可以生产一系列对象.
抽象工厂模式经常和工厂方法模式配合使用来解决对象创建的需求变化。
下面是《设计模式精解-GoF 23 种设计模式解析附 C 实现源码》中对AbstractFacotry的摘要:
AbstractFactory适用性:
1) 一个系统要独立于它的产品的创建、组合和表示时。
2)一个系统要由多个产品系列中的一个来配置时。
3) 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4) 当你提供一个产品类库,而只想显示它们的接口而不是实现时。
AbstractFactory一些优点和缺点:
1)它分离具体的类
2) 它使得易于交换产品系列
3) 它有利于产品的一致性
4) 难 以 支 持 新 种 类 的 产 品
AbstractFactory的结构如下如所示:

AbstractFactory 模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象
AbstractFactory 模式关键就是将这一组对象的创建封装到一个用于创建对象的类
AbstractFactory 模式是为创建一组(有多类)相关或依赖的对象提供创建接口,而 Factory 模式正如我在相应的文档中分析的是为一类对象提供创建接口或延迟对象的创建到子类中实现。并且可以看到,AbstractFactory 模式通常都是使用 Factory 模式实现
简单的实现代码如下:
- /* FileName : Product.h */
- #ifndef _PRODUCT_H_
- #define _PRODUCT_H_
-
- class AbstractProductA
- {
- public:
- virtual ~AbstractProductA() ;
- protected:
- AbstractProductA() ;
- } ;
-
- class AbstractProductB
- {
- public:
- virtual ~AbstractProductB() ;
- protected:
- AbstractProductB() ;
- } ;
-
- class ProductA1 : public AbstractProductA
- {
- public :
- ProductA1() ;
- ~ProductA1() ;
- };
-
- class ProductA2 : public AbstractProductA
- {
- public :
- ProductA2() ;
- ~ProductA2() ;
- };
- class ProductB1 : public AbstractProductB
- {
- public :
- ProductB1() ;
- ~ProductB1() ;
- };
-
- class ProductB2 : public AbstractProductB
- {
- public :
- ProductB2() ;
- ~ProductB2() ;
- };
-
- #endif
-
- /* FileName : Product.cpp */
- #ifndef _PRODUCT_CPP_
- #define _PRODUCT_CPP_
- #include "Product.h"
- #include <cstdio>
-
- AbstractProductA::AbstractProductA() {}
- AbstractProductA::~AbstractProductA(){}
-
- AbstractProductB::AbstractProductB() {}
- AbstractProductB::~AbstractProductB() {}
-
- ProductA1::ProductA1() {
- puts( "ProductA1.." ) ;
- }
- ProductA1::~ProductA1() {}
-
-
- ProductA2::ProductA2() {
- puts("ProductA2,," ) ;
- }
- ProductA2::~ProductA2() {}
-
- ProductB1::ProductB1() {
- puts( "ProductB1$$" ) ;
- }
- ProductB1::~ProductB1(){}
-
- ProductB2::ProductB2() {
- puts("ProductB2**" ) ;
- }
- ProductB2::~ProductB2() {}
-
- #endif
- /* FileName : AbstractFactory.h */
-
- #ifndef _ABSTRACTFACTORY_H_
- #define _ABSTRACTFACTORY_H_
-
- class AbstractProductA ;
- class AbstractProductB ;
-
- class AbstractFactory
- {
- public:
- virtual ~AbstractFactory() ;
- virtual AbstractProductA* createProductA() = 0 ;
- virtual AbstractProductB* createProductB() = 0 ;
-
- protected:
- AbstractFactory() ;
- } ;
-
- class concreteFactory1 : public AbstractFactory
- {
- public :
- concreteFactory1() ;
- ~concreteFactory1() ;
- AbstractProductA* createProductA() ;
- AbstractProductB* createProductB() ;
- } ;
-
- class concreteFactory2 : public AbstractFactory
- {
- public :
- concreteFactory2() ;
- ~concreteFactory2() ;
- AbstractProductA* createProductA() ;
- AbstractProductB* createProductB() ;
- } ;
-
- #endif
-
- /* FileName : AbstractFactory.cpp */
- #ifndef _ABSTRACTFACTORY_CPP_
- #define _ABSTRACTFACTORY_CPP_
-
- #include "AbstractFactory.h"
- #include "Product.h"
-
- #include <cstdio>
-
- AbstractFactory::AbstractFactory(){}
- AbstractFactory::~AbstractFactory() {}
-
-
- concreteFactory1::concreteFactory1(){}
- concreteFactory1::~concreteFactory1(){}
-
- AbstractProductA* concreteFactory1::createProductA()
- {
- return new ProductA1() ;
- }
-
- AbstractProductB* concreteFactory1::createProductB()
- {
- return new ProductB1() ;
- }
-
-
- concreteFactory2::concreteFactory2() {}
- concreteFactory2::~concreteFactory2() {}
-
- AbstractProductA* concreteFactory2::createProductA()
- {
- return new ProductA2() ;
- }
-
- AbstractProductB* concreteFactory2::createProductB()
- {
- return new ProductB2() ;
- }
-
- #endif
-
- /*main.cpp*/
- #include "AbstractFactory.h"
-
- int main()
- {
- AbstractFactory* ptr1 = new concreteFactory1() ;
- ptr1->createProductA() ;
- ptr1->createProductB() ;
-
- AbstractFactory* ptr2 = new concreteFactory2() ;
- ptr2->createProductA() ;
- ptr2->createProductB() ;
-
- return 0 ;
- }
-
-
- 运行结果如下:
- ProductA1..
- ProductB1$$
- ProductA2,,
- ProductB2**
原文地址:http://www.cnblogs.com/coderlee/archive/2007/12/05/984126.html
http://blog.chinaunix.net/uid-26902496-id-3432035.html