设计模式初学者笔记:Factory Method模式

如果要选择一种最多人熟悉的Factory Method模式的具体应用,那么就应该是MFC的App/Doc架构了。Factory Method主要在类框架中使用,以解决以下问题:框架必须实例化类,但框架只知道不能被实例化的抽象类。嗯,这么说有点抽象,我们上图:

上面的图中,基类Application有一个成员函数NewDocument用于创建并打开新文档(你可以将这个函数想象为对File->New菜单的响应)。该函数完成以下工作:

1. 创建新文档

2. 将该文档加入App以便于管理(比如挂到打开文档链表中)

3. 打开该文档

NewDocument函数的这三个步骤对任意类型的文档都适用,因此是属于框架的。由于框架的设计者不可能预先知道框架的使用者会创建一个什么样的文档,因此必须将CreateDocument函数交由框架使用者来实现,但在框架中又不得不调用CreateDocument这个暂时还无法实现的函数以完成上述步骤1。面临同样问题的还有Document类的Open函数。解决办法是将Application类的CreateDocument函数和Document类的Open函数实现为虚函数,并由框架使用者实现之。下面是代码:

 1 // FactoryMethod.cpp : Defines the entry point for the console application.
 2 //
 3
 4 #include "stdafx.h"
 5 #include <iostream>
 6
 7 using namespace std;
 8
 9 class App;
10 class Doc;
11 class DerivedApp;
12 class DerivedDoc;
13
14 class Doc
15 {
16 public:
17     virtual void Open() = 0;
18 };
19
20 class DerivedDoc : public Doc
21 {
22 public:
23     virtual void Open()
24     {
25         cout << "DerivedDoc opened." << endl;
26     }
27 };
28
29 class App
30 {
31 public:
32     virtual Doc* CreateDoc() = 0;
33     void NewDoc()
34     {
35         Doc *doc = CreateDoc();
36         cout << "Add new doc to the system." << endl;
37         doc->Open();
38     }
39 };
40
41 class DerivedApp : public App
42 {
43 public:
44     virtual Doc* CreateDoc()
45     {
46         return new DerivedDoc;
47     }
48 };
49
50 int _tmain(int argc, _TCHAR* argv[])
51 {
52     App *app = new DerivedApp;
53     app->NewDoc();
54     return 0;
55 }

呃,为了偷懒,我将Application类缩写为App,Document类缩写为Doc。除此以外,这段代码基本上是和类图完全对应的。

顺便吐槽下,Abstract Factory模式和Builder模式在网上能搜索到的文章数量及质量完败后续所有模式。莫非虎头蛇尾雷声大雨点小决心巨人行动矮子的并不只是本人……

时间: 2024-10-05 21:23:51

设计模式初学者笔记:Factory Method模式的相关文章

设计模式初学者笔记:Builder模式

[作者:byeyear    Email:[email protected]    首发:cnblogs    转载请注明] 在本文的开头,先森森的鄙视下自己……将Builder模式反反复复读了七八遍,才敢说自己对其有了初步的了解.这比花在Abstract Factory上的时间长多了.如果GoF将Builder模式放在第一个讲,估计我就会把这本书归结成天书直接扔一边了. Builder模式的关键在于,将“要做什么”与“做出来”分离,将“如何装配”与“完成装配”分离: Director知道“要做

图解设计模式-factory Method模式

用Template Method模式构建生成实例的工厂. 在factory method模式中,父类决定实例的生成方式,但是不决定所要生成的具体类,具体的处理交给子类负责. 角色: Product产品:它定义了在Factory Method模式中的生成的那些实例所持有的接口,由Product类扮演. Creator创建者:负责生成Product角色的抽象类,由Factory类扮演. ConcreteProduct具体产品:决定具体的产品,由IDCard类扮演. ConcreteCreator具体

GOF设计模式——Factory Method模式

一.什么是Factory Method模式 Factory Method模式是用来构建生成实例的工厂,在该模式下,父类决定实例生成的方式,但并不决定所要生成的具体类.这样的设计思想,就跟Template Method模式相似(具体参考:https://www.cnblogs.com/SysoCjs/p/10327088.html或者https://blog.csdn.net/weixin_39400271/article/details/86565016),因为Factory Method模式就

设计模式之Factory Method模式

作用:将实例的生成交给子类 用Template Method模式来构建生成实例的工厂,这就是Factory Method模式. 在Factory Method中,父类决定实例的生成方式,但并不决定所要生成的具体的类,具体的处理全部交给子类去负责 UML类图: Product类: public abstract class Product { public abstract void use(); } use方法的实现交给Product的子类 Factory类: public abstract c

菜鸟学设计模式系列笔记之Prototype模式(原型模式)

菜鸟学设计模式系列笔记之Prototype模式: Intent: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 Motivation:以一个已有的对象作为原型,通过它来创建新的对象. 在增加新的对象的时候,新对象的细节创建工作由自己来负责,从而使新对象的创建过程与框架隔离开来. 应用场景: (1)当一个系统应该独立于它的产品创建.构成和表示时 (2)当要实例化的类是在运行时刻指定时,例如动态加载 (3)为了避免创建一个产品类层次平行的工厂类层次时 (4)当一个类的实例只能有几个

c++ 设计模式8 (Factory Method 工厂方法)

5. "对象创建"类模式 通过"对象创建"类模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 5.1 工厂方法 动机: 在软件系统中,经常面临着创建对象的工作:由于需求的变化,需要创建的对象的具体类型经常变化. 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种"封装机制"来避免客户程序和这种"具体对象创建工作"的紧耦合? 代码示例

大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合. UML 图: 根据<大话设计模式>——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式: /// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> ///

设计模式学习笔记--备忘录(Mamento)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--状态(State)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这