含义:

从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。(摘自百度百科)。

另外,在Head First中说简单工厂不是一个设计模式,而像一种编程习惯。我觉得这个说的比较准确。在一个方法体中,当有大量的case when 或者 if else的时候,有“洁癖的”开发人员会进行一下简单的重构将这部分逻辑提取出来,封装成一个方法(放在当前类或一个新建的类中)。这样可以增加可读性,非常建议新人使用这种技巧,个人觉得一个方法体代码行数超过300行看着就比较累了。当封装完后发现方法体依然远远超出300行,那说明系统架构设计存在问题(一家之言)。

下面描述一个场景:

有一家电子商务公司从事酒店、机票、旅游、度假等业务。对不同业务线的订单流程我们都进行统一处理。 创建订单、订单支付、通知客人、订单最终处理。

下面看不使用简单工厂模式的实现:

/* * OrderProcessCenter.java 1.0 2014/08/11 *  * 声明:欢迎转载,请注明出处。 *  */
package com.liushijie.simple_factory;
/*** 订单中心,负责对所有类型的订单进行操作* @author array7**/
public class OrderProcessCenter {public Order OrderFlow(String type) {Order order = null;if ("air".equals(type)) {    // 航空组订单order = new AirOrder();} else if ("hotel".equals(type)) {    // 酒店组订单order = new HotelOrder();} else if ("ticket".equals(type)) {    // 门票组订单order = new TicketOrder();} else if ("xxx".equals(type)) {    // ...// TODO: some thing} else if ("yyy".equals(type)) {// TODO: some thing} else if ("zzz".equals(type)) {// TODO: some thing} else if ("123".equals(type)) {// TODO: some thing
        }order.pay();order.notifyCustomer();order.finish();return order;}
}

通过以上代码我们可以很容易发现,假设我们要维护增改订单组必须要修改那一串逻辑判断,很明显这不符合开放原则 - 对修改关闭。我们知道要改什么,知道怎么改,那就完全可以提取出来。

同时,在业务逻辑中,创建订单本身就是一个比较专一的功能,我们完全可以将其提取出来统一进行创建操作。若要新增订单只要在专职创建订单的方法中修改即可。修改后的代码如下:

/* * OrderProcessCenter.java 1.0 2014/08/11 *  * 声明:欢迎转载,请注明出处。 *  */  package com.array7.simple_factory;
/*** 订单中心,负责对所有类型的订单进行操作* @author array7**/
public class OrderProcessCenter {public Order OrderFlow(String type) {Order order = new SimpleOrderFactory().createOrder(type);order.pay();order.notifyCustomer();order.finish();return order;}
}package com.array7.simple_factory;public class SimpleOrderFactory {public Order createOrder(String type) {Order order = null;if ("air".equals(type)) {order = new AirOrder();} else if ("hotel".equals(type)) {order = new HotelOrder();} else if ("ticket".equals(type)) {order = new TicketOrder();} else if ("xxx".equals(type)) {// TODO: some thing} else if ("yyy".equals(type)) {// TODO: some thing} else if ("zzz".equals(type)) {// TODO: some thing} else if ("123".equals(type)) {// TODO: some thing
        }return order;}
}

提取完后又发现,这种方式还有一个优点:

创建订单成为了单独的实现,我们可以开放给我其他的调用方进行使用,实现了代码的复用。比如调用方生成订单,我们进行订单的后续跟进。

转载于:https://www.cnblogs.com/liushijie/p/4712927.html

设计模式学习笔记二:简单工厂模式相关推荐

  1. 大化设计模式学习笔记(简单工厂模式)

    实质:生产具有相同逻辑的构造器类,也就是由一个工厂对象决定创建出哪一种产品类的实例 案例:计算器 demo见https://github.com/mrjdrs/sign-model.git

  2. 设计模式学习笔记(一)之工厂模式、单例模式

    一.工厂模式 (1)简单工厂模式: 1 public interface IProduct { 2 3 public void saleProduct(); 4 5 } 创建一个产品接口,有一个卖产品 ...

  3. 设计模式学习笔记——03 简单工厂 工厂方法 抽象工厂

    简单工厂 简单工厂模式也成静态工厂模式,但此模式不符合开闭原则,但仍然很常用 适用范围:工厂类需要创建的对象种类比较少,客户端只需要知道传入工厂类的参数,对于如何创建对象(逻辑)不关心 上段代码: p ...

  4. 设计模式C#描述之——简单工厂模式、抽象工厂模式、单例与多例模式

    设计模式C#描述之--简单工厂模式 前 言:设计模式是软件开发领域的精髓之一.学好设计模式是目前每一个开发人员的必修课.目前关于设计模式的书很多,其中比较好的有GOF那本的中译本,但并 不很适合初学者 ...

  5. 设计模式(1)--简单工厂模式、策略模式

    设计模式(1)--简单工厂模式.策略模式 1. 简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static ...

  6. 设计模式学习笔记——享元(Flyweight)模式

    设计模式学习笔记--享元(Flyweight)模式 @(设计模式)[设计模式, 享元模式, flyweight] 设计模式学习笔记享元Flyweight模式 基本介绍 享元案例 类图 实现代码 Big ...

  7. 设计模式学习笔记——中介者(Mediator)模式

    设计模式学习笔记--中介者(Mediator)模式 @(设计模式)[设计模式, 中介者模式, Mediator] 设计模式学习笔记中介者Mediator模式 基本介绍 中介者案例 类图 实现代码 Me ...

  8. 设计模式学习笔记——单例(Singleton)模式

    设计模式学习笔记--单例(Singleton)模式 @(设计模式)[设计模式, 单例模式, Singleton, 懒汉式, 饿汉式] 设计模式学习笔记单例Singleton模式 基本介绍 单例案例 类 ...

  9. 设计模式(4)—— 简单工厂模式(Simple Factory,创建型)

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

最新文章

  1. 谁说GPT只擅长生成?清华研究力证:GPT语言理解能力不输BERT
  2. CSS Grid 网格布局全解析
  3. 三星s轻奢android+p,三星Galaxy S轻奢版5月21日将至:骁龙660处理器+安卓8.0
  4. 如何控制参照PR作PO时,PO的数量不能超过PR的数量
  5. linux 网卡是块设备吗,什么是网络块设备(Network Block Device)?
  6. JS+CSS全力打造的一级横向滑动,二级竖向下拉综合菜单
  7. 【论文写作】SSH在线订餐系统如何写软件测试章节
  8. mac系统自带python开发环境吗_Mac OS搭建Python开发环境的几个误区
  9. JAVA接口和抽象类的特点
  10. delphi dbgrid 焦点 行号_徐睿知真人版娜美?!2020釜日电影奖铅笔腿、超凶双峰,惊人身材抢下所有焦点...
  11. 手机辅助java脚本_android 手机一个辅助阅读工具
  12. 全网最详细黑苹果安装教程,轻松打造Win10+黑苹果双系统,一看就懂。
  13. 只需五步,中国电信物联网报障指引来了
  14. Shapefile属性操作之删
  15. Arqit公司将于2023年用卫星发送量子密钥;QC Ware发布量子线性代数API | 全球量子科技与工业快讯第二十六期
  16. Freemarker操作word文档
  17. iOS开发者知识普及,Swift 挑战 Objective-C,谁会笑到最后?
  18. 前端面试题:HTML 语义化的理解
  19. Anaconda下安装Tensorflow和Keras的安装教程
  20. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 优先级队列 — 左高树

热门文章

  1. python编程题-python编程练习题
  2. python pandas读取excel-Python使用Pandas读写EXCEL文件教程
  3. python关闭读写的所有的文件-Python文件操作:文件的打开关闭读取写入
  4. python画图程序-编程入门06:Python海龟绘图
  5. python自学教程 pdf-《Python编程从入门到精通》PDF高清完整版-PDF下载
  6. python能做什么项目好-python能做什么项目
  7. python中文叫什么意思-在python中%是什么意思
  8. python程序实例教程基础-Python程序设计实例教程
  9. python三维图形渲染-基于 pygtk + vtk 实现三维数据可视化(一)
  10. python绘制3d图-python中Matplotlib实现绘制3D图的示例代码