23 DesignPatterns学习笔记:C++语言实现 --- 1.2 AbstractFactory
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 }
输出展示
转载于:https://www.cnblogs.com/icmzn/p/5691353.html
23 DesignPatterns学习笔记:C++语言实现 --- 1.2 AbstractFactory相关推荐
- 23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter
23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter 2016-07-22 (www.cnblogs.com/icmzn) 模式理解 1. Adapter 定义 ...
- nltk和python的关系_NLTK学习笔记(一):语言处理和Python
目录 nltk资料下载 import nltk nltk.download() 其中,download() 参数默认是all,可以在脚本里面加上nltk.download(需要的资料库) 来进行下载 ...
- C语言学习笔记---001C语言的介绍,编译过程原理,工具等
C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...
- IOS学习笔记07---C语言函数-scanf函数
2013/8/7 IOS学习笔记07---C语言函数-scanf函数 ------------------------------ qq交流群:创梦技术交流群:251572072 ...
- IOS学习笔记07---C语言函数-printf函数
IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...
- IOS学习笔记06---C语言函数
IOS学习笔记06---C语言函数 -------------------------------------------- qq交流群:创梦技术交流群:251572072 ...
- IOS学习笔记05---C语言程序的开发运行过程
IOS学习笔记05---C语言程序的开发运行过程 0 5.C语言3-C语言程序的开发运行过程 ----------------------------------------------------- ...
- IOS学习笔记03---C语言概述
IOS学习笔记03---C语言概述 0 3.C语言1-C语言概述 qq交流群:创梦技术交流群:251572072 创梦网络赚钱群:2483 ...
- x%3e=y%3e=z的c语言表达式,我的C语学习笔记-C语言教程(三).doc
我的C语学习笔记- C语言教程(三) C语言教程---第一章: C语言概论 C语言教程---第二章: 数据类型.运算符.表达式 C语言教程---第三章: C语言程序设计初步 C语言教程---第四章: ...
最新文章
- 递归回溯最简单易懂的小例子
- 快速问医生如何快速实现 患者与医生即时问诊?
- python开三次方_python实现三次样条插值
- Simulink之变压器隔离的直流-直流变换器
- ES6 - 基础学习(22): async 函数
- 题目1131:合唱队形(最长递增子序列进阶)
- 关于 Unix 用户权限及进程权限及 Saved set-user-id
- [C/C++11语法]_[0基础]_[lamba 表达式介绍]
- 我的记事本(VB6)
- 苹果itunes软件怎么下载安装
- python牛顿迭代公式_牛顿迭代法Python实现
- 拍摄视频,真的帧率越高越好吗?
- vtk 提取等值面并显示
- vue3.0页面模板-示例
- Java奖学金评定系统设计与实现
- python删除第一行_python学习之删除DataFrame某一行/列内容
- 万能通用!权限系统就该这么设计
- layim之刷新群聊列表
- android APP闪退后如何屏蔽自启动
- 2.4G无线技术参数及行业分享
热门文章
- linux基础篇(三)
- 美国食品药物管理局证实:心脏医疗设备可被黑客入侵
- 网站被黑,通过百度/搜狗等搜索关键词访问跳转到其他网站怎么办?
- The Tips - F12开发者页面中英文切换
- 软件工程与计算II-9-软件体系结构基础
- EPROM工作原理2
- 金融图数据库选型工具“LDBC-FinBench”
- 天地图 android studio,AndroidStudio 加载 天地图 (2019年后开发授权申请)
- Free HEIC Converter(heic格式转换器)v1.0.6官方版
- Witt向量简介 §3.2.1:模理想同余简述