java设计模式学习笔记之工厂方法模式
2016-12-18 23:01
796 查看
java设计模式学习笔记之工厂方法模式
尊重原创,转载请注明出处:http://blog.csdn.net/qq137722697这是一个使用策略模式和构建模式设计的网络请求框架,去看看吧《[倾力之作]android轻量级网络请求框架MyHttputils2.1.6》
其实设计模式是有一个单一职责原则和开放封闭原则的。如果你懂这两种方式,你可能就知道简单工厂模式都违背了这两种原则。
开放-封闭原则
是指软件实体(类、模块、方式等等)应该要可以扩展,但是不能修改。单一职责原则
就一个类而言,应该仅有一个引起它变化的原因(大白话就是功能有一个就可以了)为什么违背了开放-封闭原则?看工厂类就知道了,当需求增加的时候(比如加一个m的n次幂)就是直接修改工厂类了,可以修改意味着安全性降低,比如不小心修改到其他逻辑代码产生影响等。
单一职责就更好理解了,简单工厂类中有了switch的分支,不是单一的了。
简单工厂模式的升级版——工厂方法模式
下面将继续以计算器案例为demo,Optiner计算器类不变(建议先看这篇《java设计模式学习笔记之计算器中的简单工厂模式》)public class Optioner { private int oFirstNum; private int oSecondNum; public Optioner() { } public Optioner(int oFirstNum, int oSecondNum) { this.oFirstNum = oFirstNum; this.oSecondNum = oSecondNum; } public int getResult() { return 0; } //省略get、set方法 }
将运算方法抽取为一个运算类的接口
/** * 运算工厂接口类 * Created by HDL on 2016/12/2. */ public interface IOperationFactory { Optioner createOperation();//创建运算 }
有一个加法运算:
/**加法运算 * Created by HDL on 2016/12/2. */ public class AddOptioner extends Optioner{ @Override public int getResult() { return getoFirstNum()+getoSecondNum(); } }
对应一个加法运算类的工厂类
/** * 加法运算工厂 * Created by HDL on 2016/12/2. */ public class AddOperationFactory implements IOperationFactory { @Override public Optioner createOperation() { return new AddOptioner(); } }
使用
public static void main(String[] args) { Optioner optioner = new AddOperationFactory().createOperation(); optioner.setoFirstNum(33); optioner.setoSecondNum(33); System.out.println("结果为:"+optioner.getResult()); }
结果:
某一天需求改变了,让加一个减法的功能,这就好办了,只需要加一个减法运算类和减法运算工厂类即可。
/** * 减法运算 * Created by HDL on 2016/12/2. */ public class SubOptioner extends Optioner { @Override public int getResult() { return getoFirstNum() - getoSecondNum(); } }
/** * 减法工厂 * Created by HDL on 2016/12/2. */ public class SubOperationFactory implements IOperationFactory { @Override public Optioner createOperation() { return new SubOptioner(); } }
用法:
public static void main(String[] args) { Optioner optioner = new SubOperationFactory().createOperation(); optioner.setoFirstNum(33); optioner.setoSecondNum(31); System.out.println("结果为:"+optioner.getResult()); }
结果:
是不是相对好多了?可扩展性非常强、耦合度低,但是觉得不好的就是类增加太多了,但是为高性能的代码这点付出还是值得的,还有一方面就是选择条件又变到客户端了,怎么说?就是说要实现什么功能还是要由客户端来实例化的。(其实后面还有优化的方式,即通过反射的方式,后面陆续退出相关文章)
简单工厂与工厂方法的比较
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,去除了与具体产品的依赖。最后
再来说说工厂方法模式工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。(由子类来决定需要实例化哪个)
尊重原创,转载请注明出处:http://blog.csdn.net/qq137722697
相关文章推荐
- Java设计模式之工厂方法模式——学习笔记
- java设计模式笔记之工厂方法
- 15. JAVA 反射机制 Part 2(动态代理、类的生命周期、工厂设计模式) ----- 学习笔记
- [设计模式学习笔记二][创建型模式][工厂方法(Factory Method)]
- 设计模式学习笔记三:工厂方法模式
- java 设计模式 学习笔记(1) - 简单工厂模式
- Java学习笔记之抽象(abstract)与模板方法设计模式
- 设计模式学习笔记三:工厂方法模式
- 设计模式学习笔记---模板方法模式template method pattern(Java版)
- [学习笔记]Java模板方法和单例设计模式
- java 设计模式 学习笔记(9) 模板方法模式
- java 设计模式 学习笔记(四)工厂模式
- Java-马士兵设计模式学习笔记-工厂模式-简单工厂
- 设计模式学习笔记:factory method(工厂方法)
- java 设计模式学习笔记二 工厂模式Factory
- java设计模式学习笔记-简单工厂模式
- 设计模式学习笔记(3)工厂方法
- 设计模式学习笔记——工厂方法(Factory Method)
- Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式
- JAVA学习--接口的应用:工厂方法的设计模式