一,意图

  定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

二,别名

  虚构造器 Virtual Constructor

三,适用性

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

四,结构

五,示例

  如该模式的意图所示,工厂方法模式并不难理解。我们沿用抽象工厂模式的示例例子,观察改用工厂方法模式解决这个问题的区别以及其如何把客户代码从需要实例化的具体类中解耦:

定义工厂方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

class
{
public:
virtual ~Creator();

virtual Result* ()
{
Result* p_result = new Result;
p_result->SetProductA(MakeProductA());
p_result->SetProductB(MakeProductB());
return p_result;
}
virtual AbstractProductA* MakeProductA() = 0;
virtual AbstractProductB* MakeProductB() = 0;
};

class ConcreteCreator1 : public Creator
{
public:

AbstractProductA* MakeProductA() override
{
return new ConcreteProductA1;
}
AbstractProductB* MakeProductB() override
{
return new ConcreteProductB1;
}
};

class ConcreteCreator2 : public Creator
{
public:

AbstractProductA* MakeProductA() override
大专栏  工厂方法FactoryMethod 初步学习笔记="function"> {
return new ConcreteProductA2;
}
AbstractProductB* MakeProductB() override
{
return new ConcreteProductB2;
}
};
使用工厂方法
1
2
3
4
5
6

Creator* p_creator1 = new ConcreteCreator1;
Result* p_result1 = p_creator1->CreateResult();

Creator* p_creator2 = new ConcreteCreator2;
Result* p_result2 = p_creator2->CreateResult();

  在C++中,可通过使用模板来避免创建子类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <typename T_ProductA, typename T_ProductB>
class TemplateCreator : public Creator
{
public:

AbstractProductA* MakeProductA() override
{
return new T_ProductA;
}
AbstractProductB* MakeProductB() override
{
return new T_ProductB;
}
};

Creator* p_creator3 = new TemplateCreator<ConcreteProductA3, ConcreteProductB3>;
Result* p_result3 = p_creator3->CreateResult();

Creator* p_creator4 = new TemplateCreator<ConcreteProductA4, ConcreteProductB4>;
Result* p_result4 = p_creator4->CreateResult();

  另外,可通过参数化工厂方法创建多种产品:

1
2
3
4
5
6
AbstractProductC* ConcreteCreator::MakeProductC(Type label) override
{
if (label == 5) return ConcreteProductC5;
if (label == 6) return ConcreteProductC6;
return Creator::MakeProductC(label);
}

  工厂方法并不只是被Creator调用,工厂方法也常常被运用在并行类层次(一个类将它的一些职责委托给一个独立类)的情况下:

  通常,设计以使用工厂方法开始,因为相比于其它创建型模式(需要新的类)工厂方法仅需一个新的操作。当发现需要更大的灵活性时,我们便向其它创建型模式演化。

六,相关

工厂方法FactoryMethod 初步学习笔记的更多相关文章

  1. Android NDK开发及OpenCV初步学习笔记

    https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...

  2. 设计模式之工厂方法(FactoryMethod)模式

    在五大设计原则的基础上经过GOF(四人组)的总结,得出了23种经典设计模式,其中分为三大类:创建型(5种).结构型(7种).行为型(11种).今天对创建型中的工厂方法(FactoryMethod)模式 ...

  3. 一天一个设计模式——工厂方法(FactoryMethod)模式

    一.模式说明 在前一个模板方法(Template Method)模式中,父类定义了处理流程,而流程中用到的方法交给子类去实现.类似的,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类 ...

  4. A.Kaw矩阵代数初步学习笔记 10. Eigenvalues and Eigenvectors

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  5. A.Kaw矩阵代数初步学习笔记 9. Adequacy of Solutions

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  6. A.Kaw矩阵代数初步学习笔记 8. Gauss-Seidel Method

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  7. A.Kaw矩阵代数初步学习笔记 7. LU Decomposition

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  8. A.Kaw矩阵代数初步学习笔记 6. Gaussian Elimination

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  9. A.Kaw矩阵代数初步学习笔记 5. System of Equations

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

随机推荐

  1. java课程之团队开发冲刺阶段1.8

    一.总结昨天进度 1.实现预装sqlite数据库,将数据库放在app的assets目录下,该目录在打包的时候不会压缩,所以数据库文件可以在安装之后继续使用,然后APP安装之后检测外部存储空间是否有这个 ...

  2. CTF -bugku-web-web基础 矛盾

    ---恢复内容开始--- 以GET方式获取参数 is_numeric()函数是判断是否为数字或者数字字符串 所以不能是数字或者数字字符串,但是下面$num == 1 有要求为数字1 所以构造1+任意字 ...

  3. Python Learning Day3

    爬虫练习 说是练习,实际是尝试了一些还没有具体了解的方式吧hhhhh' 基于urllib实现 import urllib.request import re url="https://www ...

  4. 吴裕雄--天生自然MySQL学习笔记:MySQL 连接的使用

    使用 MySQL 的 JOIN 在两个或多个表中查询数据. 可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询. JOIN 按照功能大致分为如 ...

  5. pywin32获得tkinter窗口句柄,并在上面绘图

    想实现用win32 API在tkinter窗口上画图,那么应该先获得tkinter窗口的句柄hwnd,然后再获得tkinter的设备hdc.尝试了FindWindow(),GetActiveWindo ...

  6. Dp(NOIp级)全解

    2018年(你还真以为我会讲保卫王国2333 LuoguP5020 货币系统 这道题就相当于求{A}的线性基大小 证明: 反证法,设该解为B,那么B定能表示出{A}的线性基,即{A}的线性基中所有数都 ...

  7. Python笔记_第四篇_高阶编程_正则表达式_1.正则表达式简介(re模块)

    1. 从一个判断手机号的问题引入: 如果给你一个字符串,去判断是否是一个手机号码,我们通过之前的学习可以有如下代码: # 如果用普通的方式去检验一个电话号码非常麻烦. def checkPhone(s ...

  8. 创建DateFrame的常用四种方式

    import pandas as pd %pylab 一.使用numpy创建 df = pd.DataFrame(np.arange(16).reshape((4,4)), index=list('a ...

  9. Linux 配置单机yum源--ISO镜像做源

    前提:防火墙关闭.SElinus关闭 1.上传ISO镜像(建议传到home目录下) [root@localhost home]# ls iso/ CentOS-.iso 2.挂载目录 [root@lo ...

  10. D. Minimax Problem(二分+二进制)

    D. Minimax Problem time limit per test 5 seconds memory limit per test 512 megabytes input standard ...