1.概述

使用设计模式可以提高代码的可复用性、可扩充性和可维护性。简单工厂模式(Simple Factory Pattern)属于创建型模式。简单工厂模式,由一个工厂对象决定创建出哪一种产品类的实例,它经常被用于封装创建对象的代码。

简单工厂模式类图结构:

SimpleFactory:简单工厂类,简单工厂模式的核心,它负责实现创建所有实例。简单工厂创建产品的方法可以被外界直接调用来创建所需的产品对象。
IProduct:抽象产品类,简单工厂模式创建的所有对象的父类,它负责描述所有实例所共有的公共函数接口。
ConcreteProduct:具体产品类,是简单工厂模式的创建目标。

2.简单工厂模式举例

假如比萨店现在需要建立一套点餐系统,需要将客户点的比萨加入到账单中。比萨店向客户推出了不同口味的比萨,有蛤蜊披萨(Clam Pizza)、素食披萨(Veggie Pizza)和芝士比萨(Cheese Pizza)等。这就用到了简单工厂模式。下面以 C++ 来实现简单工厂模式:

(1)创建抽象产品类 Pizza

class Pizza {
public://纯虚函数(抽象函数接口)virtual string getDescription() = 0;
};

(2)创建具体产品类
接着我们创建各个口味的比萨,它们都继承了抽象父类 Pizza ,并实现了父类的 getDescription() 方法。

//蛤蜊比萨
class ClamPizza :public Pizza {string name="蛤蜊比萨";
public:string getDescription() {return name + " 价格45元";}
};//素食比萨
class VeggiePizza :public Pizza {string name = "素食比萨";
public:string getDescription() {return name+ " 价格26元";;}
};//芝士比萨
class CheesePizza :public Pizza {string name = "比萨";
public:string getDescription() {return name + " 价格38元";;}
};

(3)创建简单工厂类
接下来创建一个简单工厂类,它提供了一个静态方法 createPizza() 用来生产比萨。你只需要传入你想生产的比萨名称,它就会实例化相应比萨对象:

enum PizzaName {CLAM,VEGGIE,CHEESE};
class PizzaFactory {
public:static Pizza* createPizza(PizzaName name) {Pizza* pizza = nullptr;switch (name){case CLAM:pizza = new ClamPizza();break;case VEGGIE:pizza = new VeggiePizza();break;case CHEESE:pizza = new CheesePizza();break;}return pizza;}
};

(4)客户端调用工厂类
客户端调用简单工厂类,传入不同口味比萨的名称生产出比萨并调用该对象 getDescription() 方法:

#include <iostream>
#include <string>
using namespace std;int main() {cout<<PizzaFactory::createPizza(CLAM)->getDescription()<<endl;cout<<PizzaFactory::createPizza(VEGGIE)->getDescription()<<endl;cout<<PizzaFactory::createPizza(CHEESE)->getDescription()<<endl;
}

程序输出结果:

蛤蜊比萨 价格45元
素食比萨 价格26元
比萨 价格38元

3.简单工厂模式使用场景和优缺点

使用场景:
(1)工厂类负责创建的对象比较少。
(2)客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。

优点:
使用户根据参数获得对应的类实例,避免了直接实例化类,降低用户代码与目标类间的耦合性。

缺点:
可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改简单工厂类,违背了开放封闭原则(Open Closed Principle) 。 简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。

4.小结

(1)简单工厂模式满足了 OO 设计原则:为交互对象之间的松耦合设计而努力。
(2)简单工厂模式,由一个工厂对象决定创建出哪一种产品类的实例,它经常被用于封装创建对象的代码。


参考文献

[1] 设计模式(四)简单工厂模式
[2] Freeman E.,Freeman E.,Sierra K.,et al.设计模式[M].第一版O’Reilly Taiwan公司译.北京:中国电力出版社,2015:110-117

设计模式(4)—— 简单工厂模式(Simple Factory,创建型)相关推荐

  1. Java设计模式之简单工厂模式(Simple Factory)

    [Java与模式]简单工厂模式(Simple Factory---吴义) 首先说明,Java与模式一系列的文章均是参考阎宏博士的<Java与模式>一书,加上自身的一些体会的探索,产生如下文 ...

  2. Net设计模式之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式简介(Bref Introduction)        简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实 ...

  3. 设计模式之简单工厂模式(Simply Factory)摘录

    从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种 ...

  4. 简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(四):图表库解决方案的改进,简单工厂模式的简化,简单工厂模式总结

    4 方案的改进 Sunny软件公司开发人员发现在创建具体Chart对象时,每更换一个Chart对象都需要修改客户端代码中静态工厂方法的参数,客户端代码将要重新编译,这对于客户端而言,违反了" ...

  5. 一起学习设计模式--02.简单工厂模式

    工厂模式是最常用的一类创建型设计模式.我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式. 简单工厂模式是工厂方法模式的小弟,它不属于GoF 23种设计模式,但是在软件开发中应用也颇为频 ...

  6. 从零开始学设计模式(四):工厂模式(Factory Pattern)

    作者平台: | CSDN:blog.csdn.net/qq\_4115394- | 掘金:juejin.cn/user/651387- | 知乎:www.zhihu.com/people/1024- ...

  7. 设计模式之简单工厂模式(静态工厂方法)

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

  8. c++设计模式之简单工厂模式

    模拟场景 要求使用简单工厂模式设计一个可以创建不同几何形状(如矩形.圆形.三角形)的绘图工具,每个几何图形都具有绘制Draw()和擦除Erase()两个方法: UML类图 分析需求: 首先这个绘图工具 ...

  9. 设计模式之 - 简单工厂模式

    一.什么是简单工厂模式 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,一个抽 ...

  10. C++设计模式之 简单工厂模式讲解(历史上最简单明白的例子)

    工作之余,在看资料过程中发现一个极易理解的简单工厂模式的例子,自己亲自试练一番,感觉对这个设计模式不熟悉的朋友, 一看马上就知道是什么回事了. 简单工厂模式根据提供给它的数据,返回几个可能类中的一个类 ...

最新文章

  1. java 开发工具_Java开发工具和环境,你了解多少?
  2. 测试稳压二极管特性:BZT52C4V7
  3. Android屏幕方向调整的两种方式
  4. 如何添加JWT生成的token在请求头中
  5. Angularjs 通过asp.net web api认证登录
  6. html5微信视频禁止自动全屏,关于HTML5 video标签在安卓版微信浏览器内被强行全屏播放的问题...
  7. 计算机毕业设计asp.net企业差旅管理系统(源码+系统+mysql数据库+Lw文档)
  8. 能编辑pdf文件的软件
  9. mysql三范式通俗_三范式(数据库三大范式通俗理解)
  10. 财会法规与职业道德【19】
  11. Fluent Python读后感
  12. 【剑指Offer】46. 把数字翻译成字符串
  13. 《Android之大话设计模式》--设计原则 第二章:单一职责原则 乔峰VS慕容复
  14. windows下DxDiag查看笔记本电脑主板型号信息
  15. Object.defineProperty 以及 Proxy对比和基本语法 实干vue3数据响应
  16. delphi在window10下用uniGUI开发isapi的调试方法
  17. 蓝奏云PHP解析接口,蓝奏云下载地址解析API[直链]
  18. vba不能提取服务器上文件名,从全路径文件名中获取文件名(不含路径)
  19. uniapp连接低功耗打印机实例,
  20. 物联计算机大赛,【实践科】关于举办2020“天翼物联杯”中国高校计算机大赛-网络技术挑战赛校内选拔赛的通知...

热门文章

  1. JAVA8给我带了什么——并流行和接口新功能
  2. 中科恒伦助力长江电力移动办公平台账号加固
  3. [仁润云技术团队]并发编程-(1)基本概念
  4. CSS Sprite精灵图如何缩放大小
  5. Linux常用50条命令
  6. NFS挂载及写入故障
  7. linux系统下文件查找
  8. DOS 下编写带有日期的脚本例子
  9. linux 快捷matlab_ubuntu下Matlab_Linux添加工具包操作步骤
  10. L1-077 大笨钟的心情 (15 分)-PAT 团体程序设计天梯赛 GPLT