为什么80%的码农都做不了架构师?>>>   

5月一个酷热的中午,我跟刚来不久的小兄弟,小当闲聊起了公司用的的设计模式。

我侃侃而谈道:“咱们公司,使用的设计模式不多,也就是 策略,门面,简单工厂,工厂,单例,命令,组合,模板等。”

小当:“什么是简单工厂啊?,跟工厂模式有区别吗?”

我一听,便双手交叉于胸前,略有深意的说:“你了解的工厂模式是什么?”

小当非常流利的说:“将创建的对象方法,抽取到一个类中,根据类型不同创建相应的对象。”

我叹了口气:“小当,你了解的工厂模式有误哦,这个是简单工厂”

小当充满疑惑的说:“那什么是工厂模式,什么又是简单工厂呢?”

我喝了一口水,娓娓道来:“

简单工厂不是设计模式,而是一种编程习惯。

将创建对象的方法,抽取到一个公共类中,根据类型不同创建相应的对象。

不属于23种GOF设计模式之一。

就拿获取算奖器的例子来说吧,PL3,DLT等都有自己的算奖器。简单工厂实现方式如下:

package factory;
public class SimpleCalculatorFactoryDemo {public static abstract class Calculator{private String type;public Calculator(String type) {this.type = type;}public void calculate(){System.out.println(" This "+type+" calculate is done");}}public static class PL3Calculator extends Calculator{public PL3Calculator() {super("PL3");}}public static class DLTCalculator extends Calculator{public DLTCalculator() {super("DLT");}}public static class SimpleCalculatorFactory{public  Calculator createCalculator(String type){if ("PL3".equals(type)) { return new PL3Calculator(); }else if ("DLT".equals(type)){ return new DLTCalculator(); }return null;}}public static class PrizeTicketHandler{SimpleCalculatorFactory factory;public PrizeTicketHandler(SimpleCalculatorFactory factory){this.factory=factory;}public Calculator getCalculator(String type){return factory.createCalculator(type);}}public static void main(String[] args) {SimpleCalculatorFactoryDemo. SimpleCalculatorFactory factory=new SimpleCalculatorFactory();PrizeTicketHandler prizeTicketHandler=new PrizeTicketHandler(factory);prizeTicketHandler.getCalculator("DLT").calculate();}
}

其类图如下:

我正准备往下说简单工厂的缺点的时候,小当嚼着苹果不耐烦的说:"这个你不用细说的,我早就烂熟于心了。"

抿了抿嘴,一笑说道:“那这种方式存在什么问题?”

小当停止嚼苹果,思考了10几秒说:“每新增一个类,工厂中的if判断语句也相应增加,对系统的维护和扩展非常不利。”

我点头表示认可的说道:

“确实,随着具体的产品类增加,简单工厂的逻辑需要修改,逐渐变得不易扩展和维护,并没有做的对修改关闭,对扩展开发。”

小当吃了一大口苹果后,若有所思的说道:“咱们系统中可不是这样写的,获取算奖器是分数字彩和竞彩的。”

我喝了口水后,尝试引导小当,问道:“你还记得咱们系统是如何实现的吗?”

小当扔掉苹果核,擦擦手说道:“ 当然,其实现大致如下 ”

(注意:工厂模式的实现)

package factory;
public class FactoryCalculatorDemo {public static abstract class Calculator{private String type;public Calculator(String type) {this.type = type;}public void calculate(){System.out.println(" This "+type+" calculate is done");}}public static class PL3Calculator extends Calculator {public PL3Calculator() {super("PL3");}}public static class DLTCalculator extends Calculator {public DLTCalculator() { super("DLT"); }}public static class BSKCalculator extends Calculator {public BSKCalculator() {super("BSK");}}public static class FTCalculator extends Calculator {public FTCalculator() {super("FT");}}public static abstract class CalculatorFactory{public abstract Calculator createCalculator(String type);}public static class NumberLotteryCalculatorFactory extends CalculatorFactory {@Overridepublic Calculator createCalculator(String type){if ("PL3".equals(type)){ return new PL3Calculator(); }else if ("DLT".equals(type)){ return new DLTCalculator(); }return null;}}public static class JCCalculatorFactory extends CalculatorFactory {@Overridepublic Calculator createCalculator(String type){if ("BSK".equals(type)){ return new BSKCalculator(); }else if ("FT".equals(type)){ return new FTCalculator(); }return null;}}public static void main(String[] args) {//调用者,知悉使用的子类CalculatorFactory calculatorFactory=new NumberLotteryCalculatorFactory();calculatorFactory.createCalculator("PL3").calculate();calculatorFactory=new JCCalculatorFactory();calculatorFactory.createCalculator("FT").calculate();}
}

其类图如下:

我看后很欣慰他掌握的挺好,我可以放心的走了。随后不等小当说话,强行总结说道:

“这个就是工厂模式了,定义了一个创建对象的接口,但由子类觉得要实例化的类是哪一个,即由NumberLotteryCalculatorFactory 和JCCalculatorFactory 决定实例化的类”。

小当抢着说:“NumberLotteryCalculatorFactory 和JCCalculatorFactory也实现了平行层级关系,若果有新加入的类,加入一个对应的工厂子类就好,不需要修改原来的代码”。

“是的” 我点头说道。

小当摸了摸下巴,又问道:“工厂模式了解了,那为什么系统中还会使用简单工厂呢?”

我一笑说道:“咱们校验器部分就是使用的简单工厂,校验器只有3个:注数,格式,金额,基本上不会变。所以使用简单工厂就好,记住实现功能越简单越好,Keep it Simple is best

总结:

工厂模式:定义了一个创建对象的接口,但由子类觉得要实例化的类是哪一个。

至于选择具体选择简单工厂还是工厂模式,完全看业务需要,实现功能越简单越好。

Keep it Simple is best。

---温安适,20180525

写在最后:

预计29号,就要离开这家公司了,这篇文章最后也道个别。这家公司给的工资不高,但是积累了很多经验,无论是技术,还是管理,又提升了逆商,非常感谢,再见彩福达。

转载于:https://my.oschina.net/floor/blog/1818377

你了解的工厂模式可能有误相关推荐

  1. java设计模式 工厂模式

    工厂方法模式(Factory Method) 工厂方法模式分为三种:1.普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.首先看下关系图 举例如下:(我们举一个发送邮件和短信的 ...

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

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

  3. 用最简单的例子说明设计模式(一)之单例模式、工厂模式、装饰模式、外观模式...

    设计模式 所谓设计模式,就是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一个解决方案).使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.设计模式使人们可以更加简单 ...

  4. 设计模式之工厂模式和抽象工厂

    设计模式分类 通常来说设计模式分为三大类: 创建型模式,共 5 种:工厂模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共 7 种:适配器模式.装饰器模式.代理模式.外观模式.桥接模 ...

  5. 《Java设计模式与实践》——工厂模式

    一直觉得设计模式这个东西只能浮于表面落不了地,毕竟java后端在一般情况下是很少会用到,因为大部分业务逻辑只是很简单的增删改查.最近几天想再回头看看设计模式,突然想到,如果将设计模式的理论与我们平时能 ...

  6. Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)

    从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析. 创建型模式(5种):用于描述"怎样创建对象",它的主要特点是& ...

  7. 设计模式之二:工厂模式

    转载:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html 普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进 ...

  8. java 工厂模式的写法_java工厂模式三种详解

    工厂方法模式(Factory Method) 工厂方法模式分为三种: 1.普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.首先看下关系图: 举例如下:(我们举一个发送邮件和短 ...

  9. 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态

    介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...

最新文章

  1. Jackson通过反射将Json转化为java对象
  2. 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
  3. 动态链接库和静态库的区别
  4. 笔记-信息系统安全管理-计算机信息安全保护等级划分准则
  5. ios markdown 解析_Shortcuts 教程:正则表达式修改 Markdown 链接
  6. Flutter:Navigator2.0介绍及使用
  7. 百度之星2019 初赛一 题解
  8. time、random以及序列化模块
  9. 5训练需要更改参数吗_糖尿病病人需要多喝水吗?多喝水的5大好处,了解一下...
  10. a标签传参接收_[pyecharts1.8] 系列配置之标签设置
  11. [转载]MongoDB的$inc修改器
  12. 黑客使用一个UDP数据包可以打开任何HID门禁控制器
  13. 汉字不能编程?别闹了,只是看着有点豪横,容易被开除!| 原力计划
  14. 【渝粤教育】国家开放大学2018年秋季 0538-21T社区护理 参考试题
  15. 持久化/Session和SessionFactory线程非安全和安全/Hibernate的优势
  16. WebStorm和VSCode配置
  17. python 定时任务 全局变量_APScheduler-Python定时任务
  18. 装了冰点还原如何修改计算机ip,如何改变冰点还原企业控制台的IP地址
  19. [导入]锐道dorado
  20. 【下载】《大教堂和市集》:开放源代码运动的《圣经》

热门文章

  1. GPS(北斗)拓展无线同步模块GSYN1000系列在电力、大坝、隧道、核电、密闭厂房的应用方案...
  2. NYOJ 58 步数最少 【BFS】
  3. socket心跳超时检测,快速处理新思路(适用于超大量TCP连接情况下)
  4. oracle 数据库dg搭建规范1
  5. Codeforces 994 C - Two Squares
  6. 序列化之XML序列化技术
  7. 8月8日云栖精选夜读:他的前半生是厨神,45岁却决定加入阿里巴巴
  8. 全栈溯源、mAPM、金融性能、Oracle VS. MySQL:看APM技术专场有哪些干货
  9. c编程:求出4#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。...
  10. 电脑账户与用户账户编码规则