一,意图

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

二,别名

  虚构造器 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. 干货 | DRDS 与TiDB浅析

    干货 | DRDS 与TiDB浅析 北京it爷们儿 京东云开发者社区  4月17日 在谈论数据库架构和数据库优化的时候,会常听到"分库分表"."分片".&quo ...

  2. docker入门1---docker的简介和安装

    Tomxin7 Simple, Interesting | 简单,有趣 什么是Docker? 简介: Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发 ...

  3. ubuntu16.04 + Kdevelop + ROS开发和创建catkin_ws工作空间

    https://blog.csdn.net/p942005405/article/details/75715288 https://blog.csdn.net/LOVE1055259415/artic ...

  4. h5-立方体

    1.制作一个立方体:首先要有6个面 <div class="box"> <div class="front">front</div ...

  5. Ansible-大保健

    一.Ansible大纲 Ansible被红帽收购 1.什么是Ansible 2.Ansible特性\优点 3.Ansible基础架构 控制端\被控端\inventory\ad-hoc\playbook ...

  6. 手机H5,用Jquery使图片自动填满两栏式排版

    遇上这样的排版,手机的解象度都不同,假如只用CSS3根本就做不出这样的排版:因此要用Jquery. 1. HTML <div class="postImgCenterCrop" ...

  7. JNI的第2种写法:本地方法注册

    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 孔乙己说,茴香豆的茴有四种写法,今天谈谈JNI的第2种写法:本地方法注册. 这种写法的好处是不需要使用ja ...

  8. Python验证6174猜想

    num=int(input()) c=num while c!=6174:     digits=list(str(c))     digits.sort(reverse=True)#排列最大数和最小 ...

  9. 【C#并发】00概述

    摘自<C#并发编程经典实例>[美]Stephen Cleary 并发:同时做多件事情.终端用户利用并发功能,在输入数据库的同时相应用户输入.服务器应用并发,在处理第一个请求的同时响应第二个 ...

  10. jenkins-master-slave节点配置总结

    一.jenkins分布式简单介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能 二.jenk ...