您的位置:首页 > 编程语言 > Java开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: