大话设计模式C++版——工厂方法模式
工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览《大话设计模式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++版——工厂方法模式的更多相关文章
- 大话设计模式Python实现-工厂方法模式
工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延时到其子类. #!/usr/bin/env python ...
- 大话设计模式C++版——工厂模式在COM中的典型应用
上篇<大话设计模式C++版——抽象工厂模式>中,我们拯救世界未遂,留下小小的遗憾,本篇中我们将给出一个解决方案——COM组件技术,同时也顺便扯扯工厂模式在COM组件技术中的应用. 工厂模式 ...
- IOS设计模式浅析之工厂方法模式(Factory Method)
概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...
- [设计模式]<<设计模式之禅>>工厂方法模式
1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹 ...
- java设计模式-----2、工厂方法模式
再看工厂方法模式之前先看看简单工厂模式 工厂方法模式(FACTORY METHOD)同样属于一种常用的对象创建型设计模式,又称为多态工厂模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的 ...
- C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】
一.引言 在上一篇文章中我们讲解了过渡的一种模式叫做[简单工厂],也有叫[静态工厂]的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化 ...
- 设计模式C++实现——工厂方法模式
模式定义: 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 模式结构: Creator是一个类,它实现了全部操纵产品的方法,但不实现工厂方法 ...
- 【C#设计模式3】工厂方法模式
一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...
- 重学 Java 设计模式:实战工厂方法模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
随机推荐
- 正确的前端传后台json方式
DEMO: var data=JSON.stringify({"page": {"pagenow": 1,"pagesize": 20},& ...
- Lua-面向对象中函数使用时冒号(:)和点(.)的区别
先来看一段简单的代码: local Animal = {} function Animal:Eat( food ) print("Animal:Eat", self, food) ...
- 手机网游开发指南 - 需要多NB的技术
Agent`K 似乎在三天打鱼N天晒网.只能呵呵了,懒散的家伙. 移动互联网越来越火,其中的网络游戏更是火,熊熊大火. 作为攻城师的你,作为小投资者的你,作为满脑子创意想要实现的你,肯定在四处打听:手 ...
- CSS3之3D变换实例详解
CSS3的3D效果很赞,本文实现简单的两种3D翻转效果.首先看效果和源代码,文末是文绉绉的总结部分^_^ 以下CSS代码为了简洁没有添加前缀,请视情况自行添加(自动化时代推荐使用其他的一些方法,如gu ...
- BP神经网络实现
# -*- coding: utf-8 -*- # -------------------------------------------------------------------------- ...
- UIModalPresentationStyle和UIModalTransitionStyle
一.主要用途 弹出模态ViewController是IOS变成中很有用的一个技术,UIKit提供的一些专门用于模态显示的ViewController,如UIImagePickerController等 ...
- Java虚拟机JVM学习01 流程概述
Java虚拟机JVM学习01 流程概述 Java虚拟机与程序的生命周期 一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程序时,一个虚拟机实例诞生:当程序关闭退出,这 ...
- android 数据存储Ⅱ
本章继续讲解在Android开发中,数据的存储与管理.涉及知识点:SQLite,SwipeRefreshLayout控件刷新. 1.功能需求 练习使用SQLite 做一个登录界面,数据库字段包含用户名 ...
- git pull/push项目的时候总是提示要输入用户名密码的解决方案
作者:白狼 出处:www.manks.top/article/git_tip_user_password 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否 ...
- Eclipse--Web项目中 .classpath、mymetadata、project文件的功用
Web项目中 .classpath..mymetadata..project文件的作用 创建Web Project时,会自动生成这个三个文件. 一..mymetadata文件 1.部署项目用的,把项目 ...