序
说好的每天进步一点点的,结果工作太忙,一直在加班,都没有学习新东西。我还要进BAT呢。
坚持每天学习新东西。
写代码时,意识到在代码结构上还是有点欠缺。赶紧补上。
纪录对设计模式的认识。小菜变大鸟。进攻BAT。
应用场景:
编写一个计算器控制台程序,要求输入两个数和运算符号,得到结果。
这本书使用C#写的。已有博主用JAVA写出来,参考:http://blog.csdn.net/ghsau/article/details/8163418
常见的做法:
写一个方法封装计算机的功能,我们只需传参调用此方法就OK。
public static double getResult(double numA, double numB, String operate)
分析:
体现了面向对象的封装性
这样要增加计算器的功能就需要改此方法。再者,编译时,其他方法也需要参与进来。代码耦合性太高。
最好的做法应该将加减乘除各种运算分离开来。
使用简单工厂设计模式的做法:
1.创建抽象运算类,定义公共的成员变量,和getResult()抽象方法。
2.创建加,减,乘,除具体的类继承抽象运算类,实现getResult()方法
分析:
表现出面向对象的继承性
如果需要添加运算,只需要创建一个新的类继承运算类
问题来了,我们怎么知道什么时候该创建哪个类的对象呢?
这时,就需要一个单独的类来管理这些具体的运算类。这个类就体现简单工厂设计模式。也用到了多态。
public class OperationFactory { public static Operation createOperation(String operate) { Operation op = null; if(operate == null) throw new RuntimeException("运算符不能为空!"); else if(operate.equals("+")) op = new AddOperation(); else if(operate.equals("-")) op = new SubOperation(); else if(operate.equals("*")) op = new MulOperation(); else if(operate.equals("/")) op = new DivOperation(); else throw new RuntimeException("运算符错误!"); return op; } }
一张UML类图就能清晰表现简单工厂设计模式
总结
工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
核心思想就是:有一个专门的类来负责创建实例的过程。
把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。
如果简单工厂模式所涉及到的具体产品之间没有共同的逻辑,那么我们就可以使用接口来扮演抽象产品的角色;如果具体产品之间有功能的逻辑,我们就必须把这些共同的东西提取出来,放在一个抽象类中,然后让具体产品继承抽象类。为实现更好复用的目的,共同的东西总是应该抽象出来的。