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

实际问题:

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

普通人的做法:

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 条评论
登录 后参与评论

相关文章

来自专栏ACM小冰成长之路

HDU-6010-Daylight Saving Time

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

2069
来自专栏怀英的自我修炼

Java漫谈4

之前的一篇文章,我们用段誉比武的方式类比了构件类的方式,其中把段誉和慕容复共有的出招这个动作写成了一个功能方法。所谓出招,换个角度来看,就是将人身体中的能量,比...

34810
来自专栏哈雷彗星撞地球

设计模式简介

设计模式(Design pattern)是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。 设计模式代表了最佳的实践,通常被有经验的面向对...

904
来自专栏desperate633

面向对象的 6 个基本原则

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

772
来自专栏Create Sun

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

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

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

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

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

4334
来自专栏点滴积累

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

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

4368
来自专栏java一日一条

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

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

1221
来自专栏编程之旅

《Clean Code》 读书小节(二)

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

743
来自专栏CDA数据分析师

飞跃式发展的后现代 Python 世界

如果现代Python有一个标志性特性,那么简单说来便是Python对自身定义的越来越模糊。在过去的几年的许多项目都极大拓展了Python,并重建了“Python...

2066

扫码关注云+社区