工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览《大话设计模式C++版——简单工厂模式》。在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,不符合开放—封闭原则,那么工厂方法模式会在那方面有所改进呢?我们仍以简单工厂模式中加减法计算器为例。

1、保持简单工厂模式的 IOperation 接口和实现对象(COperation_Add 和 COperation_Dec)

class IOperation
{
public:
IOperation() : m_nNuml(0), m_nNumr(0) {}
virtual ~IOperation() {} virtual void SetNum(int nNuml = 0, int nNumr = 0)
{
m_nNuml = nNuml;
m_nNumr = nNumr;
}
virtual int CalculateResult() = 0; protected:
int m_nNuml, m_nNumr;
}; class COperation_Add : public IOperation
{
public:
int CalculateResult()
{
return m_nNuml + m_nNumr;
}
}; class COperation_Dec : public IOperation
{
public:
int CalculateResult()
{
return m_nNuml - m_nNumr;
}
};

2、和加减法计算器接口类似,将工厂对象也依赖于抽象接口(和简单工厂模式不同之处)

class IOperationFactory
{
public:
virtual ~IOperationFactory() {} virtual IOperation* CreateOperation() = 0;
}; class COperationFactory_Add : public IOperationFactory
{
public:
IOperation* CreateOperation()
{
return new COperation_Add();
}
}; class COperationFactory_Dec : public IOperationFactory
{
public:
IOperation* CreateOperation()
{
return new COperation_Dec();
}
};

工厂接口 IOperationFactory 提供一个生产 IOperation 计算对象的接口,然后不同的工厂对象生产不同IOperation 计算对象(加法工厂 COperationFactory_Add 生产

COperation_Add 对象,减法工厂 COperationFactory_Dec 则生产 COperation_Dec对象),即每一个生产对象对应一个工厂类,一个工厂类只生产一种产品,如五粮液只生产白酒,而青岛啤酒则只生产啤酒。

3、使用工厂方法模式

void	Test()
{
IOperationFactory* poIOperationFactory = new COperationFactory_Add();
IOperation* poIOperation = NULL; if (!poIOperationFactory)
{
return;
} poIOperation = poIOperationFactory->CreateOperation(); if (poIOperation)
{
poIOperation->SetNum(2, 3);
printf("2 + 3 = %d\n", poIOperation->CalculateResult()); delete poIOperation;
} delete poIOperationFactory;
}

工厂方法模式使用和简单工厂模式类似,都是先弄一个工厂对象,然后调用工厂对象接口生产计算器对象,不同的是,简单工厂能根据请求类型生产多种计算器对象,而工厂方法模式的工厂只能是一种,如果要生产其他计算器对象,那就是让五粮液卖啤酒——逼良为娼了,唯一的方法只能是换家工厂来干。

那么问题来了,如果用户要计算乘法了,简单工厂的方式是在简单工厂类中增加一个switch,同时改动用户调用简单工厂接口的符号,即需要改变2处代码,工厂方法模式则需要新增一个生产乘法计算器的工厂类,同时将 poIOperationFactory
改为该工厂new出的对象,即增加一处代码(乘法工厂类),修改一处代码,实际上还是不完全符合开方—封闭原则,但工厂方法模式的改进之处在于,它将简单工厂类修改switch结构的方式改为增加乘法工厂类了,而增加(扩展)是允许的,所以工厂方法模式虽然也要修改代码,但改动减少,这就是工厂方法模式比简单工厂模式的牛X那么一点点的地方。

大话设计模式C++版——工厂方法模式的更多相关文章

  1. 大话设计模式Python实现-工厂方法模式

    工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延时到其子类. #!/usr/bin/env python ...

  2. 大话设计模式C++版——工厂模式在COM中的典型应用

    上篇<大话设计模式C++版——抽象工厂模式>中,我们拯救世界未遂,留下小小的遗憾,本篇中我们将给出一个解决方案——COM组件技术,同时也顺便扯扯工厂模式在COM组件技术中的应用. 工厂模式 ...

  3. IOS设计模式浅析之工厂方法模式(Factory Method)

    概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...

  4. [设计模式]<<设计模式之禅>>工厂方法模式

    1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹 ...

  5. java设计模式-----2、工厂方法模式

    再看工厂方法模式之前先看看简单工厂模式 工厂方法模式(FACTORY METHOD)同样属于一种常用的对象创建型设计模式,又称为多态工厂模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的 ...

  6. C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】

    一.引言 在上一篇文章中我们讲解了过渡的一种模式叫做[简单工厂],也有叫[静态工厂]的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化 ...

  7. 设计模式C++实现——工厂方法模式

    模式定义: 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 模式结构: Creator是一个类,它实现了全部操纵产品的方法,但不实现工厂方法 ...

  8. 【C#设计模式3】工厂方法模式

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

  9. 重学 Java 设计模式:实战工厂方法模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

随机推荐

  1. css选择器中:first-child与:first-of-type的区别

    :first-child选择器是css2中定义的选择器,从字面意思上来看也很好理解,就是第一个子元素.比如有段代码: p:first-child  匹配到的是p元素,因为p元素是div的第一个子元素: ...

  2. go语言 安装版 Windows7安装截图

    这个比较简单的 一路next. 查看:解压版安装go. //http://www.cnblogs.com/osfipin/

  3. user profile services提示“BAIL: MMS(7116): sql.cpp(8490): 0x80231334 (The sql connection string has unsupported values.)”解决办法

    user profile services的2个服务Forefront Identity Manager Service 和 Forefront Identity Manager Synchroniz ...

  4. Microsoft Dynamics CRM MVP

    MVP 一个响亮的名称, 不是 Kobe Bryant 不是 LeBron Raymone James 这是 Microsoft Dynamics CRM MVP 求证Link: http://mvp ...

  5. SharePoint Server 2016 IT Preview 先睹为快

    1.首先下载SharePoint Server 2016 IT Preview安装包,大约2.8GB,当然如果有需要,还可以下载两种提供测试的语言包,其他语言包还未提供下载,如下图: 2.我是在已经安 ...

  6. SPC2014 :“FOSL”不是替代InfoPath,只是另外一种创建表单的方式

    今天在SPC2014微软宣布他们技术路线图.其实,没有足够证据替代InfoPath,只是另外的一种尝试 - FOSL(对SharePoint列表表单). FOSL使用相同的引擎,用于创建表单的访问服务 ...

  7. 几个有用的JSON工具

    好久没写博客了,这里都要长草了:) 这几天研究PLM360 REST API和Infraworks REST API,一天到晚和JSON打交道,发现这几个小工具非常好用,推荐给大家. 第0个,大名鼎鼎 ...

  8. Android Studio教程--从Github 下载一个Repository

    从电脑上彻底删除HelloWorld项目 回到as欢迎页面 复制github中项目的地址 点击clone

  9. iOS开发之手势识别汇总

    iOS开发之手势识别汇总 iOS开发中手势识别有六种: 轻击手势(TapGestureRecognizer), 轻扫手势 (SwipeGestureRecognizer), 长按手势(LongPres ...

  10. raw_input() 与 input() __ Python

    这两个均是 python 的内建函数,通过读取控制台的输入与用户实现交互.但他们的功能不尽相同.举两个小例子. 1 >>> raw_input_A = raw_input(" ...