漫画:设计模式之 “工厂模式”
作者 | 小灰
来源 | 程序员小灰(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 来识别智能合约的调配模式
点分享点点赞点在看
漫画:设计模式之 “工厂模式”相关推荐
- Java设计模式(工厂模式>抽象工厂模式和原型模式)
Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...
- JavaScript设计模式--简单工厂模式例子---XHR工厂
JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...
- 三角形圆形创建与擦除java_设计模式---------------简单工厂模式
设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...
- 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式
设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...
- Java 设计模式之工厂模式(二)
原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...
- 设计模式之工厂模式(三)
上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...
- php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式
php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...
- 教你如何一篇博客读懂设计模式之—--工厂模式
一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...
- 一篇博客读懂设计模式之---工厂模式
设计模式之-工厂模式 工厂模式: 创建过程: 创建Shape接口 public interface Shape {void draw(); } 创建实现类: public class Circle i ...
- java 工厂模式详解_Java设计模式之工厂模式详解
简单工厂其实并不是设计模式,只是一种编程习惯. 首先我们创建父类Cup,所有杯子类的父类.再创建它的子类BigCup和SmallCup类. public abstract class Cup { pu ...
最新文章
- 网络编程 UDP通信的过程 TCP通信过程 多线程文件上传
- 更改记录表CDHDR和CDPOS
- 智宇科技 ZYARJX-1机械臂智能小车 —— 手机端蓝牙控制程序
- 简单聊下5G与V2X
- C# 引用类型与值类型转换-装箱和拆箱
- crontab 每周五_crontab定时任务 每隔一周的周五执行
- response php,HttpResponse.php
- 三维插值(MATLAB)——TriScatteredInterp/scatteredInterpolant函数
- Shell 监控文件变化
- 2018北邮计算机考研分数线,2018年北京邮电大学软件学院考研复试分数线
- node稳定版本_Node.js十年,你大爷还是你大爷
- (回溯法)和为n的所有不增正整数和式分解算法
- Hypermesh-优化案例学习笔记-cclip
- 360网络测速器电脑版
- 四川大学计算机学院2020转专业,四川大学化学学院2020年本科生转专业工作实施方案...
- 线性规划的对偶性和最大流最小割定理
- java 任务定时调度(定时器)
- 佳能LBP2900打印机无法正常打印.用32位驱动安装正常
- 个人微信支付接口,非二清,无需APP,支持H5
- 「2020」拼多多数据分析笔试题 | 附解答
热门文章
- SAP QM初阶之QS26 - Where-Used List for Master Insp. Characteristic
- SAP QM 执行事务代码QS51维护使用决策的选择集,系统报错 – Transaction no longer valid for catalog ‘3’ -
- SAP IDoc Post不成功,报错 - A company code cannot be determined for LI 0000100061 –
- SAP WM Interview Questions
- SAP MM41 收到报错:Retail materials cannot be maintained.
- 五个方面入手 教你如何成为领导型CIO
- SAP MM 如何看一个Inbound Delivery单据相关的IDoc?
- TensorFlow什么的都弱爆了,强者只用Numpy搭建神经网络
- 深度语义模型以及在淘宝搜索中的应用
- 免费教材丨第52期:人工智能(复杂问题求解的结构和策略)、人工智能哲学