四则运算法则表 - 简单工厂模式
2016-05-06 00:00
423 查看
摘要: [kao]: 考
抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。
具体产品角色:工厂类所创建的对象就是此角色的实例。
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
缺点
实际开发中,很多产品是一个多层次的树状结构,由于简单工厂模式中只有一个工厂类来对应这些产品,所以可能会把我们的客户端累坏
由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
一般用于小项目或或者具体产品很少扩展的情况
客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。
大牛:“是吗?你怎么写的啊?”
小鸟:“你看,这是我的代码,难道还有更简单的实现方式吗?”
大牛:“你的代码确实挺简洁的,算法也用的不错,但是你有没有想过,为什么只让你写这样一个效果呢?有点程序基础的,都知道这么写,很明显,这样的话,不能区分你们的水平,既然如此,那他为啥还要这样出呢?是无聊,是想报复公司,随便找些人去应付boss,这里的回答是否定的,那么,你再想想java是一种什么样的语言,它有什么样的特性?”
小鸟:“java是一种面向对象的语言,它的特性,地球人都知道:继承、封装、多态啊!”
大牛:“对啊!java是一种面向对象的语言,你这里体现面向对象的思想了没?继承、封装、多态这些特性用到了多少?”
小鸟:“嗯~,貌似只是实现了简单的算法,这些特性确实都没用着耶!但是这里也没必要用这些啊?”
大牛:“我觉得显示在电脑上面携带不方便,我想换到手机屏幕上去显示,这样携带方便,还能利用零散的时间随时去记忆,多好!”
小鸟:“这还不简单,直接将这个算法
大牛:“小鸟,你这话算是说对了一半。”
小鸟:“哦!是吗?那应该是?”
大牛:“
小鸟:“我会崩溃的,好不容易弄完,唉~,要改这么多地方,累死宝宝了。”
大牛:“是呢!想想就够让人抓狂的。小鸟,你再仔细想想java的特性,以及我刚才跟你说的复用。”
小鸟:“哦!我明白了,咱们就以我这次面试为例,我再给写一个,你帮我看看。”
小鸟:“牛哥,我这里将九九乘法表进行了封装,就跟你之前说的,我要在哪显示,我只需要引用它就行,至于显示在哪,不用管,这样的话,也就达到了一个复用的效果,不会再出现复制导致的灾难了。”
大牛:“悟性不错,这样确实做到了
小鸟:“牛哥,java他有三大特性,但是我只用到了一种,封装,你开始有跟我说过,这是[kao]3大特性,但是其它两种,我确实想不到,它怎么体现。”
大牛:“能思[kao],不错!那好,再启发你一下,你想想,我这里虽然只是乘法表,但是如果我想做加法表、除法表,减法表呢?”
小鸟:“这还不容易,我加一个参数,用来表示是加法、减法、还是除法,然后在改一下for循环里面的输出,添加switch case就o了。”
大牛:“小鸟,你这思维可就是计算机的思维了,你再想想,要是现在只要求你添加加法表,后来,要要求你添加减法表,你手一抖,不小心将以前的加法也改成了减法,想想最后的结果,越加越小,会不会吓死宝宝呢?再想想继承,多态。 ”
小鸟:“牛哥,这是我写的代码,这里将继承和多态都用上了,但是,我怎么知道用户什么时候要乘法表,什么时候要加法表呢?”
抽象产品角色:LowTable
具体产品角色1:Multiplication
乘法
具体产品角色2:Addition
加法
大牛:“不错,不错,真不错,那就再教你一招,
工厂类角色:LowTableFactory
大牛:“看到了吧,只要输入对应的运算符,就能找到对应的法则表对象,通过多态,调用父类的方法,即可得到我们的法则表”
客户端使用
小鸟:“这么说,我就明白了,我那天面试时,写的乘法表,确实是计算机的思维,原来一个小小的乘法表,中间还有这么大的学问,也可以写得这么精彩,谢谢你,牛哥!”
简单工厂模式
简介
定义一个创建对象的类,由这个类来封装实例化对象的行为组成角色
工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。
具体产品角色:工厂类所创建的对象就是此角色的实例。
优缺点
优点工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
缺点
实际开发中,很多产品是一个多层次的树状结构,由于简单工厂模式中只有一个工厂类来对应这些产品,所以可能会把我们的客户端累坏
由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
适用场景
有一组类似的对象需要创建(业务简单)一般用于小项目或或者具体产品很少扩展的情况
客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。
案例
四则运算表
小鸟:“牛哥,好奇怪啊,我那天面试时,面试官只让我写了一个九九乘法表,我感觉自己写的ok啊!怎么还没通知我去上班捏?”大牛:“是吗?你怎么写的啊?”
小鸟:“你看,这是我的代码,难道还有更简单的实现方式吗?”
public class Test { public static void main(String[] arrays) { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(String.format("%d*%d=%d\t", j, i, i * j)); } System.out.println(""); } } }
大牛:“你的代码确实挺简洁的,算法也用的不错,但是你有没有想过,为什么只让你写这样一个效果呢?有点程序基础的,都知道这么写,很明显,这样的话,不能区分你们的水平,既然如此,那他为啥还要这样出呢?是无聊,是想报复公司,随便找些人去应付boss,这里的回答是否定的,那么,你再想想java是一种什么样的语言,它有什么样的特性?”
小鸟:“java是一种面向对象的语言,它的特性,地球人都知道:继承、封装、多态啊!”
大牛:“对啊!java是一种面向对象的语言,你这里体现面向对象的思想了没?继承、封装、多态这些特性用到了多少?”
小鸟:“嗯~,貌似只是实现了简单的算法,这些特性确实都没用着耶!但是这里也没必要用这些啊?”
大牛:“我觉得显示在电脑上面携带不方便,我想换到手机屏幕上去显示,这样携带方便,还能利用零散的时间随时去记忆,多好!”
小鸟:“这还不简单,直接将这个算法
复制过去就行了,每一个优秀的程序员,必先是一个伟大的CV战士,拒绝重复制造轮子,能复制则复制。”
大牛:“小鸟,你这话算是说对了一半。”
小鸟:“哦!是吗?那应该是?”
大牛:“
复用,每一个优秀的程序员,必先是一个伟大的CV战士,拒绝重复制造轮子,能复用则复用。小鸟,你再想想,当你在做一个大型的项目时,里面有好多相同的功能,只是,展示出来的效果有点不同,这时你会想,这项目也太容易了,我写好一个,改一下ui,然后就将它复制到其它地方就行了,复制,复制,复制到这,复制到那,都谁复制,太容易了,你非常兴奋的,通宵达旦的就将所有功能开发完毕,然后准备上线,这时测试美美发现了一个小bug。”
小鸟:“我会崩溃的,好不容易弄完,唉~,要改这么多地方,累死宝宝了。”
大牛:“是呢!想想就够让人抓狂的。小鸟,你再仔细想想java的特性,以及我刚才跟你说的复用。”
小鸟:“哦!我明白了,咱们就以我这次面试为例,我再给写一个,你帮我看看。”
public class Multiplication { public static void mutiplicationTable() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(String.format("%d*%d=%d\t", j, i, i * j)); } System.out.println(""); } } }
小鸟:“牛哥,我这里将九九乘法表进行了封装,就跟你之前说的,我要在哪显示,我只需要引用它就行,至于显示在哪,不用管,这样的话,也就达到了一个复用的效果,不会再出现复制导致的灾难了。”
大牛:“悟性不错,这样确实做到了
界面逻辑与业务逻辑的分离。”
小鸟:“牛哥,java他有三大特性,但是我只用到了一种,封装,你开始有跟我说过,这是[kao]3大特性,但是其它两种,我确实想不到,它怎么体现。”
大牛:“能思[kao],不错!那好,再启发你一下,你想想,我这里虽然只是乘法表,但是如果我想做加法表、除法表,减法表呢?”
小鸟:“这还不容易,我加一个参数,用来表示是加法、减法、还是除法,然后在改一下for循环里面的输出,添加switch case就o了。”
大牛:“小鸟,你这思维可就是计算机的思维了,你再想想,要是现在只要求你添加加法表,后来,要要求你添加减法表,你手一抖,不小心将以前的加法也改成了减法,想想最后的结果,越加越小,会不会吓死宝宝呢?再想想继承,多态。 ”
小鸟:“牛哥,这是我写的代码,这里将继承和多态都用上了,但是,我怎么知道用户什么时候要乘法表,什么时候要加法表呢?”
抽象产品角色:LowTable
public abstract class LowTable { public abstract void low(); }
具体产品角色1:Multiplication
乘法
public class Multiplication extends LowTable{ @Override public void low() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(String.format("%d*%d=%d\t", j, i, i * j)); } System.out.println(""); } } }
具体产品角色2:Addition
加法
public class Addition extends LowTable { @Override public void low() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(String.format("%d+%2d=%3d", j, i, i+j)); } System.out.println(""); } } }
大牛:“不错,不错,真不错,那就再教你一招,
简单工厂模式,在此基础上,加一个工厂类,用来实例化对象,已解决你不知道用哪个对象的疑惑。”
工厂类角色:LowTableFactory
public class LowTableFactory { public static LowTable createLowTable(String tableName) { switch (tableName) { case "*": return new Multiplication(); case "+": return new Addition(); } return new Multiplication(); } }
大牛:“看到了吧,只要输入对应的运算符,就能找到对应的法则表对象,通过多态,调用父类的方法,即可得到我们的法则表”
客户端使用
public static void main(String[] arrays) { LowTable lowTable = LowTableFactory.createLowTable("+"); lowTable.low(); }
小鸟:“这么说,我就明白了,我那天面试时,写的乘法表,确实是计算机的思维,原来一个小小的乘法表,中间还有这么大的学问,也可以写得这么精彩,谢谢你,牛哥!”
相关文章推荐
- 一步一步跟我学易语言之第二个易程序菜单设计
- 基于逻辑运算的简单权限系统(原理,设计,实现) VBS 版
- C#中设计、使用Fluent API
- 基于逻辑运算的简单权限系统(原理,设计,实现) VBS 版
- 介绍php设计模式中的工厂模式
- asp.net 简单工厂模式和工厂方法模式之论述
- 深入理解JavaScript系列(28):设计模式之工厂模式详解
- js简单工厂模式用法实例
- JavaScript设计模式初探
- JavaScript设计模式经典之工厂模式
- javascript 模式设计之工厂模式详细说明
- JavaScript 组件之旅(一)分析和设计
- 实例解析Java单例模式编程中对抽象工厂模式的运用
- C# 事件的设计与使用深入理解
- 大型网站设计注意事项大全
- Android中的脑残设计总结
- python中getattr函数使用方法 getattr实现工厂模式
- 工厂模式在Zend Framework中应用介绍
- 浅析php工厂模式
- C++设计模式之抽象工厂模式