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

实际问题:

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

普通人的做法:

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

相关文章

来自专栏程序员的SOD蜜

使用泛型委托,构筑最快的通用属性访问器

最近做一个父类的属性向子类的属性赋值的小程序,用了下AutoMapper组件,感觉不错,想探究下它的原理,自己动手做一个例子试试看。实现这个功能,第一反应使用反...

2259
来自专栏影子

SpringMVC接收复杂对象

转载请注明地址:http://www.cnblogs.com/funnyzpc/p/7642977.html

1265
来自专栏王磊的博客

聊聊asp.net中Web Api的使用

扯淡     随着app应用的崛起,后端服务开发的也越来越多,除了很多优秀的nodejs框架之外,微软当然也会在这个方面提供更便捷的开发方式。这是微软一贯的作风...

3596
来自专栏影子

SpringMVC接收复杂对象

1044
来自专栏影子

SpringMVC接收复杂对象

34510
来自专栏前端笔记

【 图形游戏 Tetris 】原生 JavaScript 做小游戏

俄罗斯方块 (俄罗斯开发经典游戏) 游戏简介 《俄罗斯方块》(Tetris, 俄文:Тетрис)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲...

31110
来自专栏NetCore

关于某道C#上机题的OO

前两天在园子里,有人出了一道《关于一道C#上机题的一点想法》,大概的意思呢是利用OO的思想来进行编程,接着又有一位朋友,也写了自己的答案,此朋友非常厉害,从类图...

2006
来自专栏恰同学骚年

自己动手写游戏:Flappy Bird

START:最近闲来无事,看了看一下《C#开发Flappy Bird游戏》的教程,自己也试着做了一下,实现了一个超级简单版(十分简陋)的Flappy Bird...

622
来自专栏大数据

功能式Python中的探索性数据分析

这里有一些技巧来处理日志文件提取。假设我们正在查看一些Enterprise Splunk提取。我们可以用Splunk来探索数据。或者我们可以得到一个简单的提取并...

3061
来自专栏Java 技术分享

WEB 小案例 -- 网上书城(二)

2677

扫码关注云+社区