三分钟理解“简单工厂模式”——设计模式轻松掌握

实际问题:

由于超市隔三差五就要办促销活动,但每次促销活动的方式不一样,所以需要开发一个软件,营业员只要输入原价再选择活动类型后,就能计算出折扣以后的价钱。

普通人的做法:

mian(){ String input = readLine(); double price = readLine(); switch (input) case "九五折": price = price * 0.95; break; case "满100返50": if(price>=100) price = price - 50; break; case "不打折": break; println("打折后价钱:"+price); }

这样写会有几个问题:

1.若现在增加新的打折方式,就要修改这段代码,这就打破了“开放-封闭”的原则。

2.这段代码不易复用。当这个收银系统的其他地方也需要计算折后价的时候,只能将这段代码复制过去;那如果在维护中发现开发人员把“满100返50”写成了“满10000返50”,这时候就需要改两个地方,非常不便。

所以高级做法是:

1.将这一个个折扣抽象成类,这样方便代码的复用;

2.将对不同折扣的判断从客户程序中转移到被调用类中,从而降低客户程序中代码的复杂度。

高级做法的类图:

1.此时,对促销类型的判断从客户端转移到了Factory类中,从而用户程序只需要给Factory的get促销类()函数传入一个促销名称就能够获取该促销类的对象。

2.代码如上图构造之后,要获取促销类对象,只需要调用:

促销类 促销对象 = Factory.get促销类("促销名称");

折后价 price = 促销对象.getResult(原价);

工厂模式的作用:

工厂是用来管理、创建对象的。

如果一个类会根据情况的不同产生含有不同属性值的对象,或者一个类会根据情况的不同产生不同的子类对象,这时候需要使用工厂模式,在工厂中完成究竟创建哪种类型的对象的判断,客户端只需在Factory.getBean(key)函数中传入一个key,就能够获取对应类型的对象。

因此,工厂模式能够将“客户端对究竟创建何种类型的判断”转移到Factory中,从而减少客户端代码的复杂度,降低服务端与客户端之间的藕合度。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏take time, save time

你所能用到的数据结构(六)

八、数据结构不一定很枯燥   正如我现在实习的公司的一个同事说的那样,数据结构是一本催眠的书,我想对于大多数人应该是这样的,当然对我也是,看着一大堆的算法,结...

34750
来自专栏阿杜的世界

《重构》阅读笔记-代码的坏味道

开发者必须通过实践培养自己的经验和直觉,培养出自己的判断力:学会判断一个类内有多少个实例变量算是太大、学会判断一个函数内有多少行代码才算太长。

7820
来自专栏java一日一条

Java函数式开发——优雅的Optional空指针处理

空闲时会抽空学习同在jvm上运行的Groovy和Scala,发现他们对null的处理比早期版本Java慎重很多。在Java8中,Optional为函数式编程的n...

24710
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-day05-超市收银系统案例题

Java基础-day05-超市收银系统案例题 案例描述 将超市购物小票案例中,键盘录入部分封装为方法。 将switch语句完成的三个分支代码逻辑封装为3个方法 ...

65340
来自专栏Java大联盟

23种设计模式详解(三)

10510
来自专栏点滴积累

《类型编程晋级——shapeless类库使用指南》前言及第一章翻译

从年初开始进行此项工作,我和合作伙伴包亮付出了大量而艰辛的劳动。翻译中我们本着能够让所有人看明白、看懂的目的,反复修改高达五次。现基本翻译完毕,有出版意向,如果...

45480
来自专栏编程之旅

《Clean Code》 读书小节(二)

之前在看了《Clean Code》这本书的前两章时,就写下了第一篇读书小节,而随着读书的深入,便决定再总结一下后面一部分的读书心得。

8930
来自专栏ACM小冰成长之路

HDU-6010-Daylight Saving Time

ACM模版 描述 ? 题解 这个题的难点在于题目不好懂,只要读懂了题目,细心一些的人都能做出来。 大致的思路是先预处理出来每年的两个时间节点,也就是每年三月份的...

25090
来自专栏Create Sun

设计模式--------工厂模式

前言   两个月前写过一次设计模式系列,但很不满意就删除了。显然希望能做到学以致用,而非看书总结,设计模式绝对是你解决问题的一个思路,但在这有点自己的小建议,设...

35980
来自专栏desperate633

面向对象的 6 个基本原则

一个类只做它该做的事情。 是指一个类的功能要单一, 一个类只负责一个职责。 一个类只做它该做的事情(高内聚)。 在面向对象中, 如果只让一个类完成它该做的事,...

9620

扫码关注云+社区

领取腾讯云代金券