(创建型模式)Abstract Factory——抽象工厂模式
一、意图
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
二、核心思想
三、优缺点分析
GOOD:
(1)最大的好处是易于交换产品系列,由于具体工厂类在一个应用中只需要初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。如ACCESS->SQL SERVER;
(2)第二大好处是:它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。如客户端只知道使用IUser和IDepartment,至于它是用SQL Server还是Access来实现就不知道了。
BAD:
当需要增加功能时,就需要增加很多类
四、标准UML图
抽象基类:
1)ProductA,ProductB:分别代表不同类型的产品,而它们的派生类则是这种产品的一个实现。
2)AbstractFactory:生产这一系列产品的一个抽象工厂,它的派生类是不同的实现。
接口函数:
AbstractFactory::CreateProductA和AbstractFactory::CreateProductB:分别是生产不同产品的不同实现,由各个派生出来的抽象工厂实现之。
解析:
Abstract Factory模式和Factory最大的差别是抽象工厂创建的是一系列相关的对象,其中创建的实现其实采用的就是Factory模式的方法,对于某个实现的有一个派生出来的抽象工厂,另一个实现有另一个派生出来的工厂。
需要特别注意的是区分不同类型的产品和这些产品的不同实现,如果有n种产品同时有m种不同的实现,那么根据乘法原理可知有n*m个简单工厂模式在运用。
五、标准源码
1: /************************************************************************
2: * FileName : AbstractFactory.h
3: * Author : steven oyj (steven.oyj@gmail.com)
4: * Description : AbstractFactory的演示代码
5: * Time : 2010/5/18
6: ************************************************************************/
7: #ifndef ABSTRACTFACTORY_H
8: #define ABSTRACTFACTORY_H
9: 10: // 抽象基类AbstractProductA,代表产品A的抽象
11: class AbstractProductA
12: {13: public:
14: AbstractProductA() {}15: virtual ~AbstractProductA(){};
16: }; 17: 18: // 派生类ConcreateProductA1,继承自AbstractProductA,代表产品A的第一种实现
19: class ConcreateProductA1
20: : public AbstractProductA
21: {22: public:
23: ConcreateProductA1();24: virtual ~ConcreateProductA1();
25: }; 26: 27: // 派生类ConcreateProductA2,继承自AbstractProductA,代表产品A的第二种实现
28: class ConcreateProductA2
29: : public AbstractProductA
30: {31: public:
32: ConcreateProductA2();33: virtual ~ConcreateProductA2();
34: }; 35: 36: // 抽象基类AbstractProductB,代表产品B的抽象
37: class AbstractProductB
38: {39: public:
40: AbstractProductB() {}41: virtual ~AbstractProductB(){};
42: }; 43: 44: // 派生类ConcreateProductB1,继承自AbstractProductB,代表产品B的第一种实现
45: class ConcreateProductB1
46: : public AbstractProductB
47: {48: public:
49: ConcreateProductB1();50: virtual ~ConcreateProductB1();
51: }; 52: 53: // 派生类ConcreateProductB2,继承自AbstractProductB,代表产品B的第二种实现
54: class ConcreateProductB2
55: : public AbstractProductB
56: {57: public:
58: ConcreateProductB2();59: virtual ~ConcreateProductB2();
60: }; 61: 62: // 抽象基类AbstractFactory,工厂的抽象类,生产产品A和产品B
63: class AbstractFactory
64: {65: public:
66: AbstractFactory(){}67: virtual ~AbstractFactory(){}
68: 69: virtual AbstractProductA* CreateProductA() = 0;
70: virtual AbstractProductB* CreateProductB() = 0;
71: }; 72: 73: // 派生类ConcreateFactory1,继承自AbstractFactory
74: // 生产产品A和产品B的第一种实现
75: class ConcreateFactory1
76: : public AbstractFactory
77: {78: public:
79: ConcreateFactory1();80: virtual ~ConcreateFactory1();
81: 82: virtual AbstractProductA* CreateProductA();
83: virtual AbstractProductB* CreateProductB();
84: }; 85: 86: // 派生类ConcreateFactory2,继承自AbstractFactory
87: // 生产产品A和产品B的第二种实现
88: class ConcreateFactory2
89: : public AbstractFactory
90: {91: public:
92: ConcreateFactory2();93: virtual ~ConcreateFactory2();
94: 95: virtual AbstractProductA* CreateProductA();
96: virtual AbstractProductB* CreateProductB();
97: }; 98: 99: #endif
1: #include <iostream>
2: #include "AbstractFactory.h"
3: 4: ConcreateProductA1::ConcreateProductA1() 5: {6: std::cout << "construction of ConcreateProductA1\n";
7: } 8: 9: ConcreateProductA1::~ConcreateProductA1() 10: {11: std::cout << "destruction of ConcreateProductA1\n";
12: } 13: 14: ConcreateProductA2::ConcreateProductA2() 15: {16: std::cout << "construction of ConcreateProductA2\n";
17: } 18: 19: ConcreateProductA2::~ConcreateProductA2() 20: {21: std::cout << "destruction of ConcreateProductA2\n";
22: } 23: 24: ConcreateProductB1::ConcreateProductB1() 25: {26: std::cout << "construction of ConcreateProductB1\n";
27: } 28: 29: ConcreateProductB1::~ConcreateProductB1() 30: {31: std::cout << "destruction of ConcreateProductB1\n";
32: } 33: 34: ConcreateProductB2::ConcreateProductB2() 35: {36: std::cout << "construction of ConcreateProductB2\n";
37: } 38: 39: ConcreateProductB2::~ConcreateProductB2() 40: {41: std::cout << "destruction of ConcreateProductB2\n";
42: } 43: 44: ConcreateFactory1::ConcreateFactory1() 45: {46: std::cout << "construction of ConcreateFactory1\n";
47: } 48: 49: ConcreateFactory1::~ConcreateFactory1() 50: {51: std::cout << "destruction of ConcreateFactory1\n";
52: } 53: 54: AbstractProductA* ConcreateFactory1::CreateProductA() 55: {56: return new ConcreateProductA1();
57: } 58: 59: AbstractProductB* ConcreateFactory1::CreateProductB() 60: {61: return new ConcreateProductB1();
62: } 63: 64: ConcreateFactory2::ConcreateFactory2() 65: {66: std::cout << "construction of ConcreateFactory2\n";
67: } 68: 69: ConcreateFactory2::~ConcreateFactory2() 70: {71: std::cout << "destruction of ConcreateFactory2\n";
72: } 73: 74: AbstractProductA* ConcreateFactory2::CreateProductA() 75: {76: return new ConcreateProductA2();
77: } 78: 79: AbstractProductB* ConcreateFactory2::CreateProductB() 80: {81: return new ConcreateProductB2();
82: }1: #include "AbstractFactory.h"
2: #include <stdlib.h>
3: #include <stdio.h>
4: 5: int main()
6: {7: printf("%d\n",sizeof(long));
8: // 生产产品A的第一种实现
9: ConcreateFactory1 *pFactory1 = new ConcreateFactory1;
10: AbstractProductA *pProductA = pFactory1->CreateProductA(); 11: 12: // 生产产品B的第二种实现
13: ConcreateFactory2 *pFactory2 = new ConcreateFactory2;
14: AbstractProductB *pProductB = pFactory2->CreateProductB(); 15: 16: delete pFactory1;
17: delete pProductA;
18: delete pFactory2;
19: delete pProductB;
20: 21: system("pause");
22: 23: return 0;
24: }

浙公网安备 33010602011771号