夏天/isummer

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

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

23 DesignPatterns学习笔记:C++语言实现 --- 1.1 Factory

 2016-07-18 13:03:43


 

模式理解

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 CFactory
 8 {
 9 public:
10     //CFactory();
11     //~CFactory();
12     //可以维护一类产品的创建
13     static CAbsProductA* getProduct(ProductAEnum productAType);
14 };
15 
16 #endif

factory.cpp

 1 #include "Factory.h"
 2 
 3 CAbsProductA* CFactory::getProduct(ProductAEnum type)
 4 {
 5     CAbsProductA *pProdcutA = nullptr;
 6     switch (type)
 7     {
 8     case eProductA1:
 9         pProdcutA = new CProductA1();
10         break;
11     case eProductA2:
12         pProdcutA = new CProductA2();
13         break;
14     }
15     if (!pProdcutA)
16         throw "CProdutA constructed fail!!!";
17     return pProdcutA;
18 }

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 CommonMethod1() = 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 CommonMethod1();
27 
28 };
29 class CProductA2 :public CAbsProductA
30 {
31 public:
32     CProductA2();
33 public:
34     ~CProductA2();
35 public:
36     void CommonMethod1();
37 
38 };
39 //具体派生类B...
40 #endif

Product.cpp

 1 #include "Product.h"
 2 #include <iostream>
 3 using namespace std;
 4 
 5 CAbsProductA::CAbsProductA()
 6 {
 7 
 8 }
 9 
10 CAbsProductA::~CAbsProductA()
11 {
12 }
13 
14 CProductA1::CProductA1()
15 {
16     cout << "CProductA1 构建" << endl;
17 }
18 
19 CProductA1::~CProductA1()
20 {
21     cout << "CProductA1 析构" << endl;
22 }
23 
24 void CProductA1::CommonMethod1()
25 {
26     cout << "CProductA1 业务逻辑" << endl;
27 }
28 
29 
30 CProductA2::CProductA2()
31 {
32     cout << "CProductA2 构建" << endl;
33 }
34 
35 CProductA2::~CProductA2()
36 {
37     cout << "CProductA2 析构" << endl;
38 }
39 
40 void CProductA2::CommonMethod1()
41 {
42     cout << "CProductA2 业务逻辑" << endl;
43 }

main.cpp

 1 #include "stdafx.h"
 2 #include "Factory.h"
 3 using namespace std;
 4 #include <iostream>
 5 int _tmain(int argc, _TCHAR* argv[])
 6 {
 7     //instream_iteratork
 8     CFactory* pFactory = new CFactory();
 9     CAbsProductA* pProductA = pFactory->getProduct(eProductA1);
10     pProductA->CommonMethod1();
11     pProductA = pFactory->getProduct(eProductA2);
12     pProductA->CommonMethod1();
13 
14     //简单工厂方法模式
15     pProductA = CFactory::getProduct(eProductA1);
16     pProductA->CommonMethod1();
17     pProductA = CFactory::getProduct(eProductA2);
18     pProductA->CommonMethod1();
19 
20     system("pause");
21     return 0;
22 }

 


 

输出展示

 

posted on 2016-07-18 13:07  夏天/isummer  阅读(242)  评论(0)    收藏  举报