如果要选择一种最多人熟悉的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函数实现为虚函数,并由框架使用者实现之。下面是代码:

 // FactoryMethod.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <iostream> using namespace std; class App;
class Doc;
class DerivedApp;
class DerivedDoc; class Doc
{
public:
virtual void Open() = ;
}; class DerivedDoc : public Doc
{
public:
virtual void Open()
{
cout << "DerivedDoc opened." << endl;
}
}; class App
{
public:
virtual Doc* CreateDoc() = ;
void NewDoc()
{
Doc *doc = CreateDoc();
cout << "Add new doc to the system." << endl;
doc->Open();
}
}; class DerivedApp : public App
{
public:
virtual Doc* CreateDoc()
{
return new DerivedDoc;
}
}; int _tmain(int argc, _TCHAR* argv[])
{
App *app = new DerivedApp;
app->NewDoc();
return ;
}

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

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

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

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

    [作者:byeyear    Email:byeyear@hotmail.com    首发:cnblogs    转载请注明] 在本文的开头,先森森的鄙视下自己……将Builder模式反反复复读了七 ...

  2. 面向对象设计模式纵横谈:Factory Method 工厂方法模式(笔记记录)

    从耦合关系谈起 耦合关系直接决定着软件面对变化时的行为 -模块与模块之间的紧耦合使得软件面对变化时,相关模块都要随之更改 -模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其 ...

  3. 设计模式(四)Factory Method模式

    简单来说,用Template Method模式来构建生成实例的工厂,就是Factory Method模式.在这个模式中,父类决定实例的生成方式,但不决定所要生成的具体的类,具体的处理全部交给子类负责. ...

  4. 设计模式之Factory Method模式

    作用:将实例的生成交给子类 用Template Method模式来构建生成实例的工厂,这就是Factory Method模式. 在Factory Method中,父类决定实例的生成方式,但并不决定所要 ...

  5. Factory Method模式

    Factory Method(工厂方法)模式属于GoF设计模式中的创建型分组,它用于在不之制定待创建对象的具体类的情况下创建对象.--<asp.net设计模式> 说白了就是一个人想要出国旅 ...

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

    5. “对象创建”类模式 通过“对象创建”类模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 5.1 工厂方法 动机: ...

  7. 设计模式之笔记--工厂方法模式(Factory Method)

    工厂方法模式(Factory Method) 定义 工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 类图 描 ...

  8. C#面向对象设计模式纵横谈——5.Factory Method 工厂方法模式(创建型模式)

    动机 (Motivation) 在软件系统中,经常面临着“某个对象”的创建工作; 由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何应对这种变化?如何提供一种“封装机制” ...

  9. 【创建型】Abstract Factory模式 & Factory Method模式

    本文主要介绍简单工厂模式与抽象工厂模式.以下如有叙述不当之处,欢迎批评指正,欢迎交流探讨. 一:简单工厂模式 在23种设计模式中,简单工厂模式其实是不在列的,但理解该模式对于抽象工厂模式的思想理解是有 ...

随机推荐

  1. iis 管理员执行 aspnet_iis.exe

    如果我们在注册iis的时候,出现上图的问题,我们需要在桌面上新建一个快捷方式 然后在目标处添上我们的命令. 比如:C:\Windows\Microsoft.NET\Framework\v4.0.303 ...

  2. 理解 %IOWAIT (%WIO)

    %iowait 是 “sar -u” 等工具检查CPU使用率时显示的一个指标,在Linux上显示为 %iowait,在有的Unix版本上显示为 %wio,含义都是一样的,这个指标常常被误读,很多人把它 ...

  3. SAP保存操作记录CDHDR和CDPOS表

    http://blog.sina.com.cn/s/blog_7dce1fac01014yp2.html转自sap的字段和对象的修改都会保存旧值,数据保存在CDHDR和CDPOS表中,提取旧值可以采用 ...

  4. SAP自定义打印机纸张

    1 执行Spad,->点击"完全管理"->点击"设备类型" 2 点击"页格式" 3 新增两个页格式,  点击 更改->创建 ...

  5. 权限分配界面 纯手工 仅用到bootstrap的架构 以及 c标签

    <div class="form-group">        <div class="row">         <label ...

  6. jq中的三元运算结构

    三元运算的结构为:Boolean?值1:值2.它的第一个参数必须为布尔值.

  7. Android SDK Manager Google Apis 下载

    本意是想利用google的gcm来实装android推送功能的,很遗憾, google貌似已经停止提供啥服务给国内了,或者说国内想继续使用google 服务暂时变得几乎不可能了.找了个代理来进行goo ...

  8. 越狱Season 1-Episode 20: Tonight

    Season 1, Episode 20: Tonight -Pope: I want him under 24hour surveillance. surveillance: 监视 保证24小时监视 ...

  9. CSS 通用原子类

    /*文字排版*/.f10 { font-size: 10px; }.f11 { font-size: 11px; }.f12 { font-size: 12px; }.f13 { font-size: ...

  10. 硬链接与软连接[转自vbird]

    前言 在 Linux 底下的连结档有两种,一种是类似 Windows 的快捷方式功能的文件,可以让你快速的链接到目标文件(或目录),这种是软链接: 另一种则是透过文件系统的 inode 连结来产生新档 ...