作者 | 小灰

来源 | 程序员小灰(ID:chengxuyuanxiaohui)

—————  第二天  —————

————————————

ClassA a = new ClassA();
ClassB b = new ClassB();

假设我们的业务代码当中,有一个被广泛引用的“口罩类”,这个类实例需要在许多地方被创建和初始化,而初始化的代码也比较复杂。

public class Mask {    //构造函数    public Mask(){        // .....        // 100行初始化代码    }}

针对这种情况,我们可以构建一个“口罩工厂”专门负责创建口罩对象,把口罩的初始化代码迁移到工厂类的创建方法当中:

public class MaskFactory {public Mask createMask() {        Mask mask = new Mask();        // .....        // 100行初始化代码        return mask;    }}

假设口罩类只是一个抽象接口,有两个子类“高端口罩”和“低端口罩”分别实现了这个接口:

public interface IMask {    void show();}
public class HighEndMask implements IMask {    @Override    public void show() {        System.out.println("我是高端口罩");    }}
public class LowEndMask implements IMask {    @Override    public void show(){        System.out.println("我的低端口罩");    }
}

那么口罩工厂该如何创建这两种类型的口罩呢?

很简单,在创建方法中传入参数(这里的参数是type),根据参数来做条件判断,决定创建什么样的口罩:

public class MaskFactory{public IMask createMask(String type) {        IMask mask = null;        if("高端口罩".equals(type)){            mask = new HighEndMask();            // .....            // HighEndMask的100行初始化代码        }else if("低端口罩".equals(type)){            mask =  new LowEndMask();            // .....            // LowEndMask的100行初始化代码        }        return mask;    }}

在客户端,想要创建什么样的口罩对象,只需传入对应的类型名称:

public class Test {public static void main(String[] args) {        MaskFactory factory = new MaskFactory();        IMask maskA = factory.createMask("高端口罩");        IMask maskB = factory.createMask("低端口罩");        maskA.show();        maskB.show();    }}

(注:所谓面向对象的开放-封闭原则,就是在程序中对“扩展”开放,对“修改”封闭。如果每次业务改动都要增加新的if-else,就涉及对旧有代码的修改,不但容易出错,可读性也不好。)

让我们根据这个思路,重构一下工厂类的逻辑:

public interface IMaskFactory {    IMask createMask();}
public class HighEndFactory implements IMaskFactory{@Override    public IMask createMask() {        IMask mask =  new HighEndMask();        // .....        // HighEndMask的100行初始化代码        return mask;    }}
public class LowEndFactory implements IMaskFactory{@Override    public IMask createMask() {        IMask mask =  new LowEndMask();        // .....        //  LowEndMask的100行初始化代码        return mask;    }}

在代码中,工厂类变成了抽象的接口,高端口罩工厂和低端口罩工厂这两个子类分别实现了该接口。

在客户端,想要创建什么样的口罩对象,只需实例化不同的工厂子类,调用相同的创建方法,无需再传入参数:

public class Test {public static void main(String[] args) {IMaskFactory factoryA = new LowEndFactory();IMaskFactory factoryB = new HighEndFactory();IMask maskA = factoryA.createMask();IMask maskB = factoryB.createMask();maskA.show();maskB.show();}
}

更多精彩推荐
☞35 岁一刀切?任正非:华为没有年龄限制,如只看年龄自己早被淘汰
☞如何一句话证明自己不是菜鸟?| 每日趣闻
☞云网络十年:探路者阿里云的理想和坚持
☞云起云涌:PaaS 体系架构与运维系统上云实践
☞滴滴AI Labs负责人叶杰平离职!CTO 张博接任
☞借助 Solidity 来识别智能合约的调配模式
点分享点点赞点在看

漫画:设计模式之 “工厂模式”相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. java 工厂模式详解_Java设计模式之工厂模式详解

    简单工厂其实并不是设计模式,只是一种编程习惯. 首先我们创建父类Cup,所有杯子类的父类.再创建它的子类BigCup和SmallCup类. public abstract class Cup { pu ...

最新文章

  1. 网络编程 UDP通信的过程 TCP通信过程 多线程文件上传
  2. 更改记录表CDHDR和CDPOS
  3. 智宇科技 ZYARJX-1机械臂智能小车 —— 手机端蓝牙控制程序
  4. 简单聊下5G与V2X
  5. C# 引用类型与值类型转换-装箱和拆箱
  6. crontab 每周五_crontab定时任务 每隔一周的周五执行
  7. response php,HttpResponse.php
  8. 三维插值(MATLAB)——TriScatteredInterp/scatteredInterpolant函数
  9. Shell 监控文件变化
  10. 2018北邮计算机考研分数线,2018年北京邮电大学软件学院考研复试分数线
  11. node稳定版本_Node.js十年,你大爷还是你大爷
  12. (回溯法)和为n的所有不增正整数和式分解算法
  13. Hypermesh-优化案例学习笔记-cclip
  14. 360网络测速器电脑版
  15. 四川大学计算机学院2020转专业,四川大学化学学院2020年本科生转专业工作实施方案...
  16. 线性规划的对偶性和最大流最小割定理
  17. java 任务定时调度(定时器)
  18. 佳能LBP2900打印机无法正常打印.用32位驱动安装正常
  19. 个人微信支付接口,非二清,无需APP,支持H5
  20. 「2020」拼多多数据分析笔试题 | 附解答

热门文章

  1. SAP QM初阶之QS26 - Where-Used List for Master Insp. Characteristic
  2. SAP QM 执行事务代码QS51维护使用决策的选择集,系统报错 – Transaction no longer valid for catalog ‘3’ -
  3. SAP IDoc Post不成功,报错 - A company code cannot be determined for LI 0000100061 –
  4. SAP WM Interview Questions
  5. SAP MM41 收到报错:Retail materials cannot be maintained.
  6. 五个方面入手 教你如何成为领导型CIO
  7. SAP MM 如何看一个Inbound Delivery单据相关的IDoc?
  8. TensorFlow什么的都弱爆了,强者只用Numpy搭建神经网络
  9. 深度语义模型以及在淘宝搜索中的应用
  10. 免费教材丨第52期:人工智能(复杂问题求解的结构和策略)、人工智能哲学