一,意图

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

二,别名

  虚构造器 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. Bugku 加密(持续更新)

    1.滴答~滴 不多说,摩斯密码解密. 2.聪明的小羊 栅栏密码解密. 3.ok Ook解密 4.这不是摩斯密码 brainfuck解码 5.简单加密 凯撒有两种编码脚本,一种是字母26内循环移位,一种 ...

  2. Tomcat导入工程

    Windows->Preference->Server->Runtime environment->Add浏览路径(选择Workbench default JRE)

  3. JavaScript 2019.3.15

    方法名.call(对象)可以切换方法调用的对象 参数数量 基本数据类型 typeof无法更细致的区分引用类型(全是object) =

  4. tomcat运行方式详解

    tomcat的运行模式有3种 一.bio(blocking I/O) 即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包).是基于JAVA的HTTP/1 ...

  5. java日志处理汇总

    org.apache.commons.lang3.time.DateUtils https://blog.csdn.net/yihaoawang/article/details/50638199

  6. 猜数字游戏(随机数和Scannner的应用)

    在指定范围内生成一个随机数作为目标值,用户对目标值进行猜测. import java.util.Random; // 随机数 import java.util.Scanner; // 获取用户输入 p ...

  7. php 随机useragent

    <?php /** * 获取随机useragent */ private function get_rand_useragent($param) { $arr = array( 'Mozilla ...

  8. BP算法推导python实现

    def sigmoid(inX):   return 1.0/(1+exp(-inX))   '''标准bp算法每次更新都只针对单个样例,参数更新得很频繁sdataSet 训练数据集labels 训练 ...

  9. pearson相关系数的介绍

  10. 图形化编程娱乐于教,Kittenblock实例,图章效果的音乐画面

    跟很多学生聊过,很多学生不是不努力,只是找不到感觉.有一点不可否认,同样在一个教室上课,同样是一个老师讲授,学习效果迥然不同.关键的问题在于,带入感,我能给出的建议,就是咬咬牙,坚持住,没有学不会的知 ...