抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

二、核心思想

    

三、优缺点分析

GOOD:

(1)最大的好处是易于交换产品系列,由于具体工厂类在一个应用中只需要初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。如ACCESS->SQL SERVER;

(2)第二大好处是:它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。如客户端只知道使用IUser和IDepartment,至于它是用SQL Server还是Access来实现就不知道了。

BAD:

当需要增加功能时,就需要增加很多类

四、标准UML图

(创建型模式)Abstract Factory——抽象工厂模式

抽象基类:

1)ProductA,ProductB:分别代表不同类型的产品,而它们的派生类则是这种产品的一个实现。

2)AbstractFactory:生产这一系列产品的一个抽象工厂,它的派生类是不同的实现。

接口函数:

AbstractFactory::CreateProductA和AbstractFactory::CreateProductB:分别是生产不同产品的不同实现,由各个派生出来的抽象工厂实现之。

解析:

Abstract Factory模式和Factory最大的差别是抽象工厂创建的是一系列相关的对象,其中创建的实现其实采用的就是Factory模式的方法,对于某个实现的有一个派生出来的抽象工厂,另一个实现有另一个派生出来的工厂。

需要特别注意的是区分不同类型的产品和这些产品的不同实现,如果有n种产品同时有m种不同的实现,那么根据乘法原理可知有n*m个简单工厂模式在运用。

五、标准源码

/************************************************************************
 * FileName    : AbstractFactory.h
 * Author      : steven oyj (steven.oyj@gmail.com)
 * Description : AbstractFactory的演示代码
 * Time        : 2010/5/18
 ************************************************************************/
#ifndef ABSTRACTFACTORY_H
#define ABSTRACTFACTORY_H
   9:  
// 抽象基类AbstractProductA,代表产品A的抽象
class AbstractProductA
  12: {
public:
  14:     AbstractProductA() {}
virtual ~AbstractProductA(){};
  16: };
  17:  
// 派生类ConcreateProductA1,继承自AbstractProductA,代表产品A的第一种实现
class ConcreateProductA1
public AbstractProductA
  21: {
public:
  23:     ConcreateProductA1();
virtual ~ConcreateProductA1();
  25: };
  26:  
// 派生类ConcreateProductA2,继承自AbstractProductA,代表产品A的第二种实现
class ConcreateProductA2
public AbstractProductA
  30: {
public:
  32:     ConcreateProductA2();
virtual ~ConcreateProductA2();
  34: };
  35:  
// 抽象基类AbstractProductB,代表产品B的抽象
class AbstractProductB
  38: {
public:
  40:     AbstractProductB() {}
virtual ~AbstractProductB(){};
  42: };
  43:  
// 派生类ConcreateProductB1,继承自AbstractProductB,代表产品B的第一种实现
class ConcreateProductB1
public AbstractProductB
  47: {
public:
  49:     ConcreateProductB1();
virtual ~ConcreateProductB1();
  51: };
  52:  
// 派生类ConcreateProductB2,继承自AbstractProductB,代表产品B的第二种实现
class ConcreateProductB2
public AbstractProductB
  56: {
public:
  58:     ConcreateProductB2();
virtual ~ConcreateProductB2();
  60: };
  61:  
// 抽象基类AbstractFactory,工厂的抽象类,生产产品A和产品B
class AbstractFactory
  64: {
public:
  66:     AbstractFactory(){}
virtual ~AbstractFactory(){}
  68:  
virtual AbstractProductA* CreateProductA() = 0;
virtual AbstractProductB* CreateProductB() = 0;
  71: };
  72:  
// 派生类ConcreateFactory1,继承自AbstractFactory
// 生产产品A和产品B的第一种实现
class ConcreateFactory1
public AbstractFactory
  77: {
public:
  79:     ConcreateFactory1();
virtual ~ConcreateFactory1();
  81:  
virtual AbstractProductA* CreateProductA();
virtual AbstractProductB* CreateProductB();
  84: };
  85:  
// 派生类ConcreateFactory2,继承自AbstractFactory
// 生产产品A和产品B的第二种实现
class ConcreateFactory2
public AbstractFactory
  90: {
public:
  92:     ConcreateFactory2();
virtual ~ConcreateFactory2();
  94:  
virtual AbstractProductA* CreateProductA();
virtual AbstractProductB* CreateProductB();
  97: };
  98:  
#endif

相关文章: