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 }
输出展示
浙公网安备 33010602011771号