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