前言

模式介绍

在之前简单工厂模式中,我们介绍了简单工厂模式的缺陷是违背了开放-封闭原则。如果在面馆中添加了烤海参,那将会修改waiter工厂类。违背了类内封闭原则。

还以面馆为例,现在两种面,用一个服务员来卖就可以,如果这个服务员不干了,后面卖面的厨师需要兼职顶替服务员,但是厨师又不能离开灶台,就将模式改成了窗口排队式,一队海参炒面,另一队辣根汤面。每个窗口分别有一个厨师放饭,一个会做海参炒面,另一个会做辣根汤面。老板觉得这种模式挺好,万一来了一个会做烤海参的,就只需要开一个烤海参的窗口就好了,不需要重新要服务员学习,因为烤海参的就会卖。这就变成了工厂模式。

UML类图

这里涉及到2种类①我,客户端,排队买饭。②做饭厨师类,工厂类,为我生成饭。③菜品类,生成菜品类。具体关系如下UML类图:

代码实例

下面是noodle类,是为工厂类使用的,继承他就可以扩展noodle类别:

#ifndef NOODLE_H
#define NOODLE_Hclass noodle
{
public:noodle() {}~noodle() {}virtual void eating() = 0;
};#endif // NOODLE_H

下面是海参炒面类,继承了noodle,实现eating方法,吃海参炒面:

#ifndef HAISHENNOODLE_H
#define HAISHENNOODLE_H#include "noodle.h"class haishennoodle : public noodle
{
public:haishennoodle();~haishennoodle();virtual void eating();
};#endif // HAISHENNOODLE_H
#include <iostream>
#include "haishennoodle.h"haishennoodle::haishennoodle()
{}haishennoodle::~haishennoodle()
{}void haishennoodle::eating()
{std::cout << "我是海参炒面,里面没有海参哦!!吃的时候注意!" << std::endl;
}

下面是辣根汤面,继承了noodle,实现eating方法,吃辣根汤面:

#ifndef LAGENNOODLE_H
#define LAGENNOODLE_H#include "noodle.h"class lagennoodle : public noodle
{
public:lagennoodle();~lagennoodle();virtual void eating();
};#endif // LAGENNOODLE_H
#include <iostream>
#include "lagennoodle.h"lagennoodle::lagennoodle()
{}lagennoodle::~lagennoodle()
{}void lagennoodle::eating()
{std::cout << "我是辣根汤面,吃完呛的哼啊!!!" << std::endl;
}

下面是waiter工厂的基类。所有工厂都继承这个类:

#ifndef WAITER_H
#define WAITER_Hclass noodle;
class waiter
{
public:waiter() {}~waiter() {}virtual noodle *createnoodle() = 0;
};#endif // WAITER_H

下面是海参厨师(工厂1),海参厨师只管做海参炒面,重写了createnoodle方法:

#ifndef HAISHEN_H
#define HAISHEN_H#include "waiter.h"class noodle;
class haishen : public waiter
{
public:haishen();~haishen();virtual noodle *createnoodle();
};#endif // HAISHEN_H
#include <iostream>
#include "haishen.h"
#include "haishennoodle.h"haishen::haishen()
{}haishen::~haishen()
{}noodle *haishen::createnoodle()
{std::cout << "面是我炒得,我的名字叫海参!!!" << std::endl;return new haishennoodle();
}

下面是辣根厨师(工厂1),辣根厨师只管做辣根汤面,重写了createnoodle方法:

#ifndef LAGEN_H
#define LAGEN_H#include "waiter.h"class lagen : public waiter
{
public:lagen();~lagen();virtual noodle *createnoodle();
};#endif // LAGEN_H
#include <iostream>
#include "lagen.h"
#include "lagennoodle.h"lagen::lagen()
{}lagen::~lagen()
{}noodle *lagen::createnoodle()
{std::cout << "吃辣根汤面,你不觉得呛得哼吗??" << std::endl;return new lagennoodle();
}

下面是客户端,客户端通过类别,使用相应的工厂类建立相应的实例:

#include <iostream>
#include <string.h>#include "haishen.h"
#include "lagen.h"
#include "noodle.h"using namespace std;char *product_list[] = {"haishen-noodle","lagen-noodle",NULL
};int main()
{char *p = NULL;char *pd = "haishen-noodle";int i = 0;waiter *w = NULL;noodle *n = NULL;for(p = product_list[i]; p != NULL; i++, p = product_list[i]) {if(strncmp(pd, p, strlen(pd)) == 0) {if(i == 0) {w = new haishen();} else if(i == 1) {w = new lagen();} else {cout << "对不起,请您排在队内!!!" << std::endl;break;}}}if(w) n = w->createnoodle();if(n) n->eating();if(w) {delete w; w = NULL;}if(n) {delete n; n = NULL;}return 0;
}

下面是CMakeList.txt文件,帮助生成Makefile:

cmake_minimum_required(VERSION 2.8)project(noodle-factory)
set(SRC_LIST main.cpp noodle.h waiter.h haishen.h haishen.cpp haishennoodle.h haishennoodle.cpplagennoodle.h lagennoodle.cpp lagen.h lagen.cpp)
add_executable(${PROJECT_NAME} ${SRC_LIST})

编译运行结果

代码下载链接是:https://github.com/erguangqiang/freesir_headfirst/blob/master/noodle-factory.tar.gz
使用cmake生成Makefile,并编译出可执行程序noodle。运行结果如下:

erguangqiang@elab$./noodle-factory
面是我炒得,我的名字叫海参!!!
我是海参炒面,里面没有海参哦!!吃的时候注意!

结束

工厂模式解决了简单工厂违背了的开放-封闭原则。虽然累的结构变的复杂了,但是对于扩展性得到了很大的提高。

转载于:https://www.cnblogs.com/freeman2012/p/11206166.html

深入浅出《设计模式》之工厂模式(C++)相关推荐

  1. java工厂模式 uml_深入浅出设计模式-简单工厂模式

    模式定义 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式定义了一个创建对象的类,由这个类来封装实例化 ...

  2. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  3. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  4. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  5. 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式

    设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...

  6. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  7. 设计模式之工厂模式(三)

    上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...

  8. php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式

    php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...

  9. 教你如何一篇博客读懂设计模式之—--工厂模式

    一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...

  10. 一篇博客读懂设计模式之---工厂模式

    设计模式之-工厂模式 工厂模式: 创建过程: 创建Shape接口 public interface Shape {void draw(); } 创建实现类: public class Circle i ...

最新文章

  1. postgresql存储过程输出参数
  2. Docker入门与七牛kirk工具
  3. hibernate实体的几种状态
  4. 超融合和服务器关系_关于超融合一体机,联想有话说
  5. *** line xxxx of `fraud.data': bad value of xxxx for attribute `id_11'
  6. css3 display.,CSS3 display知识详解
  7. EH使用IPMI基础操作
  8. 用足球阵型告诉你,阿里云如何护航全网70%世界杯流量
  9. magic ui3.0是鸿蒙系统吗,magicui3.1更新内容要不要升级 magicui3.0新功能体验
  10. 中国移动计算机类行测题目,2021三大运营商春招笔试:中国移动行测练习题(2)...
  11. CSITool的安装过程(参照官方教程进行细节处理)
  12. 【数据分析与挖掘实战】航空公司客户价值分析
  13. 英飞凌XC2000系列——汽车ECU Bootloader 设计详解
  14. 爬取百思不得姐段子图片
  15. 2021最新版上传透明头像易语言源码
  16. 前端生成二维码图片以及条形码图片
  17. android系统蓝牙自动连接
  18. JOI2017 春季合宿:Railway Trip
  19. 不等距双杆模型_电磁感应之双杆模型.ppt
  20. curl: (7) Failed to connect to 2600:1f1c:2d4:8900:17a1:2e94:9f90:f91e: 网络不可达

热门文章

  1. python无法安装pycurl_Python安装pycurl失败的解决方法
  2. Windows下Maven的下载、安装及IntelliJ IDEA集成配置
  3. Java包装类和基本数据类型的对照
  4. HH SaaS电商系统的商品关联版式功能模块设计
  5. VueJS ajax综合案例
  6. mac mysql 重设密码_Mac下忘记mysql密码重新设置密码的图文教程
  7. 归并排序 java_归并排序(Java实现)
  8. c语言中,char型数据是以什么形式存储的?
  9. scanf在c语言中的作用是什么?
  10. 蓝桥杯7届c语言 c组答案,第七届蓝桥杯C语言C组-(自己懂的题目)