夏天/isummer

Sun of my life !Talk is cheap, Show me the code! 追风赶月莫停留,平芜尽处是春山~

博客园 首页 新随笔 联系 管理

23 DesignPatterns学习笔记:C++语言实现 --- 1.2 AbstractFactory

 2016-07-21

(www.cnblogs.com/icmzn)


 

模式理解

 

 1. Factory method 定义
    一个创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类实例化延迟到子类。

2. factory method 设计模式优点:
(1)工厂方法是典型的解构框架,高层模块只需要知道产品的“抽象类”,其他的实现类都不需要关心(高层与底层特例解耦);
高层只依赖产品的抽象类。
(2)屏蔽产品特例类。产品的实例化是由工厂负责的,如使用使用JDBC连接数据库,数据库从MySQL切换到oracle,
只需要改动的地方是棋换一下“驱动名称”,这是factory模式灵活性的直接案例。
(3)扩展性非常优秀。对于后续变化的产品,只需要添加产品类,修改一下工厂方法即可。
(4)良好的封装。上层的调用只需要特定的(约束性)的特征,即可封装同类产品的创建过程,降低模块间的耦合

3. factory method 模式 适用场景:
(1)factory方法 是 一类对象new 的良好替代品。需要考虑是否增加一个工厂类管理的,增加代码的复杂度。
(2)需要灵活地额可扩展的方法,可以考虑factory方法。

4. factory method 模式的扩展
(1)缩小为“简单工厂方法”模式,或“静态工厂方法”模式
    如果此模块只需要一个工厂方法,则没有必要把他实例处理new 出来,只需要使用类的静态成员方法即可
Factory::getProduct(),这样简化了工厂类的创建。
    调用者也变得简单了,该模式是factory method 方法的弱化, 成为Simple Factory Method,
(2)升级为“多工厂类“
    如果初始化一个类会相当复杂,且使代码结构不清晰,所有的类创建都放在一个factory method 方法中,方法会变得巨大
    可以为每一个类的创建都定义一个factory,这样结构清晰简单。或者再抽象出工厂基类,作为协调类,封装子类工厂。
但是因为每一个类对应一个工厂类,维护性变得差,增加了扩展的难度。
(3)延迟初始化,
    以factory method 模式为基础,通过增加map类型成员,容纳不同类型的初始化对象。通过map缓冲,对初始化对象缓冲保留,下次直接取出。
    还可以通过map控制相应类的初始化数量。


 

程序实现(C++)

 

 factory.h

 1 #pragma once
 2 #ifndef _FACTORY_H_
 3 #define _FACTORY_H_
 4 #include "Product.h"
 5 
 6 //抽象工厂模式
 7 class CAbsFactory
 8 {
 9 public:
10     virtual CAbsProductA* getProductA() = 0;
11     virtual CAbsProductB* getProductB() = 0;
12 };
13 
14 //1类型的不同产品
15 class CFactory1 : public CAbsFactory
16 {
17 public:
18     //可以维护一组或相互依赖的类
19     CAbsProductA* getProductA();
20     CAbsProductB* getProductB();
21 };
22 
23 //2类型的不同产品
24 class CFactory2 : public CAbsFactory
25 {
26 public:
27     //可以维护一组或相互依赖的类
28     CAbsProductA* getProductA();
29     CAbsProductB* getProductB();
30 };
31 
32 #endif

factory.cpp

 1 #include "Factory.h"
 2 
 3 CAbsProductA* CFactory1::getProductA()
 4 {
 5     return new CProductA1();
 6 }
 7 CAbsProductB* CFactory1::getProductB()
 8 {
 9     return new CProductB1();
10 }
11 
12 //相互依赖的类组合在一个类中
13 CAbsProductA* CFactory2::getProductA()
14 {
15     return new CProductA2();
16 }
17 CAbsProductB* CFactory2::getProductB()
18 {
19     return new CProductB2();
20 }

product.h

 1 #pragma once
 2 #ifndef _PRODUCT_H_
 3 #define _PRODUCT_H_
 4 
 5 //抽象产品
 6 class CAbsProductA
 7 {
 8 //protected://保护构造接口,且抽象类不能实例化
 9 //    CAbsProductA();
10 //public:
11 //    ~CAbsProductA();
12 public:
13     //虚函数
14     virtual void CommonMethodA() = 0;
15 };
16 enum ProductAEnum {eProductA1, eProductA2 };
17 
18 //具体派生类A
19 class CProductA1 :public CAbsProductA
20 {
21 public:
22     CProductA1();
23 public:
24     ~CProductA1();
25 public:
26     void CommonMethodA() override;
27 
28 };
29 class CProductA2 :public CAbsProductA
30 {
31 public:
32     CProductA2();
33 public:
34     ~CProductA2();
35 public:
36     void CommonMethodA() override;
37 
38 
39 };
40 //具体派生类B...
41 
42 //抽象产品
43 class CAbsProductB
44 {
45 //protected://保护构造接口,且抽象类不能实例化
46 //    CAbsProductB();
47 //public:
48 //    ~CAbsProductB();
49 public:
50     //虚函数
51     virtual void CommonMethodB() = 0;
52 };
53 
54 
55 //具体派生类A
56 class CProductB1 :public CAbsProductB
57 {
58 public:
59     CProductB1();
60 public:
61     ~CProductB1();
62 public:
63     void CommonMethodB() override;
64 
65 };
66 class CProductB2 :public CAbsProductB
67 {
68 public:
69     CProductB2();
70 public:
71     ~CProductB2();
72 public:
73     void CommonMethodB() override;
74 
75 
76 };
77 
78 #endif

product.cpp

 1 #include "Product.h"
 2 #include <iostream>
 3 using namespace std;
 4 
 5 CProductA1::CProductA1()
 6 {
 7     cout << "CProductA1 构建" << endl;
 8 }
 9 
10 CProductA1::~CProductA1()
11 {
12     cout << "CProductA1 析构" << endl;
13 }
14 
15 void CProductA1::CommonMethodA()
16 {
17     cout << "CProductA1 业务逻辑" << endl;
18 }
19 
20 
21 CProductA2::CProductA2()
22 {
23     cout << "CProductA2 构建" << endl;
24 }
25 
26 CProductA2::~CProductA2()
27 {
28     cout << "CProductA2 析构" << endl;
29 }
30 
31 void CProductA2::CommonMethodA()
32 {
33     cout << "CProductA2 业务逻辑" << endl;
34 }
35 
36 //
37 CProductB1::CProductB1()
38 {
39     cout << "CProductB1 构建" << endl;
40 }
41 
42 CProductB1::~CProductB1()
43 {
44     cout << "CProductB1 析构" << endl;
45 }
46 
47 void CProductB1::CommonMethodB()
48 {
49     cout << "CProductB1 业务逻辑" << endl;
50 }
51 
52 
53 CProductB2::CProductB2()
54 {
55     cout << "CProductB2 构建" << endl;
56 }
57 
58 CProductB2::~CProductB2()
59 {
60     cout << "CProductB2 析构" << endl;
61 }
62 
63 void CProductB2::CommonMethodB()
64 {
65     cout << "CProductB2 业务逻辑" << endl;
66 }
67 
68 
69 //dafd

 


模板应用

 main.cpp

 1 // AbstractFactory.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <iostream>
 6 #include "Factory.h"
 7 
 8 int _tmain(int argc, _TCHAR* argv[])
 9 {
10     //抽象工厂,关键通过一个相互关联的类组合在一起,完成不同工厂类的管理
11     CAbsFactory *pFactroy = nullptr;
12     CAbsProductA *pProductA = nullptr;
13     CAbsProductB *pProductB = nullptr;
14 
15     pFactroy = new CFactory2();
16     pProductA = pFactroy->getProductA();
17     pProductB = pFactroy->getProductB();
18     pProductA->CommonMethodA();
19     pProductB->CommonMethodB();
20     delete pFactroy;
21     //在创建1类的产品族时,只创建了一个对象,便于维护
22     //曾佳产品族等级扩展容易,增加新产品困难。
23     pFactroy = new CFactory1();
24     pProductA = pFactroy->getProductA();
25     pProductB = pFactroy->getProductB();
26     pProductA->CommonMethodA();
27     pProductB->CommonMethodB();
28     delete pFactroy;
29 
30     system("pause");
31     return 0;
32 }

 

输出展示

 

 

posted on 2016-07-21 12:52  夏天/isummer  阅读(166)  评论(0编辑  收藏  举报