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 }
输出展示