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相关推荐

  1. 23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter

    23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter 2016-07-22 (www.cnblogs.com/icmzn) 模式理解 1. Adapter 定义 ...

  2. nltk和python的关系_NLTK学习笔记(一):语言处理和Python

    目录 nltk资料下载 import nltk nltk.download() 其中,download() 参数默认是all,可以在脚本里面加上nltk.download(需要的资料库) 来进行下载 ...

  3. C语言学习笔记---001C语言的介绍,编译过程原理,工具等

    C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...

  4. IOS学习笔记07---C语言函数-scanf函数

    2013/8/7 IOS学习笔记07---C语言函数-scanf函数 ------------------------------ qq交流群:创梦技术交流群:251572072            ...

  5. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

  6. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

  7. IOS学习笔记05---C语言程序的开发运行过程

    IOS学习笔记05---C语言程序的开发运行过程 0 5.C语言3-C语言程序的开发运行过程 ----------------------------------------------------- ...

  8. IOS学习笔记03---C语言概述

    IOS学习笔记03---C语言概述 0 3.C语言1-C语言概述         qq交流群:创梦技术交流群:251572072                        创梦网络赚钱群:2483 ...

  9. x%3e=y%3e=z的c语言表达式,我的C语学习笔记-C语言教程(三).doc

    我的C语学习笔记- C语言教程(三) C语言教程---第一章: C语言概论 C语言教程---第二章: 数据类型.运算符.表达式 C语言教程---第三章: C语言程序设计初步 C语言教程---第四章: ...

最新文章

  1. 递归回溯最简单易懂的小例子
  2. 快速问医生如何快速实现 患者与医生即时问诊?
  3. python开三次方_python实现三次样条插值
  4. Simulink之变压器隔离的直流-直流变换器
  5. ES6 - 基础学习(22): async 函数
  6. 题目1131:合唱队形(最长递增子序列进阶)
  7. 关于 Unix 用户权限及进程权限及 Saved set-user-id
  8. [C/C++11语法]_[0基础]_[lamba 表达式介绍]
  9. 我的记事本(VB6)
  10. 苹果itunes软件怎么下载安装
  11. python牛顿迭代公式_牛顿迭代法Python实现
  12. 拍摄视频,真的帧率越高越好吗?
  13. vtk 提取等值面并显示
  14. vue3.0页面模板-示例
  15. Java奖学金评定系统设计与实现
  16. python删除第一行_python学习之删除DataFrame某一行/列内容
  17. 万能通用!权限系统就该这么设计
  18. layim之刷新群聊列表
  19. android APP闪退后如何屏蔽自启动
  20. 2.4G无线技术参数及行业分享

热门文章

  1. linux基础篇(三)
  2. 美国食品药物管理局证实:心脏医疗设备可被黑客入侵
  3. 网站被黑,通过百度/搜狗等搜索关键词访问跳转到其他网站怎么办?
  4. The Tips - F12开发者页面中英文切换
  5. 软件工程与计算II-9-软件体系结构基础
  6. EPROM工作原理2
  7. 金融图数据库选型工具“LDBC-FinBench”
  8. 天地图 android studio,AndroidStudio 加载 天地图 (2019年后开发授权申请)
  9. Free HEIC Converter(heic格式转换器)v1.0.6官方版
  10. Witt向量简介 §3.2.1:模理想同余简述