这个也属于工厂设计模式的一种,上篇设计模式文章我说过,简单工厂设计模式代码有股味道。问题在哪呢???我们发现如果扩展运算的话,首先要创建一个对应的操作类,然后在工厂中加一层判断,那么我们添加功能的时候就违背了“开放-封闭原则”了,因为每次扩展功能都要连珠修改大量代码,耦合度太高了。
今天就介绍一个他的升级版设计模式,算是比较好的方式了—— 工厂方法设计模式。最大优点就是减少了必要的逻辑判断。
原理是将创建操作的过程抽象化,有什么操作实现这个接口,可以很好地扩展。工厂方法模式实现时,实际上是将工厂内部的逻辑判断迁移到了客户端,客户端需要决定哪一个工厂来实现运算类,这也是这一种设计模式暴露出的不好的味道。
下面来撸代码:
抽象产品类:用于定义产品都有哪些属性和操作
package com.zndroid.dm.FactoryModel.MethodFactory.opration;
/**
* Created by luzhenyu on 2016/8/15.
*/
public abstract class Operation {
protected double numA;
protected double numB;
public void setNumA(double numA) {
this.numA = numA;
}
public void setNumB(double numB) {
this.numB = numB;
}
public abstract double getResult();
}
具体产品类:具体实现属性和操作
package com.zndroid.dm.FactoryModel.MethodFactory.opration.impl;
import com.zndroid.dm.FactoryModel.MethodFactory.opration.Operation;
/**
* Created by luzhenyu on 2016/8/20.
*/
public class AddOpration extends Operation {
@Override
public double getResult() {
return numA + numB;
}
}
package com.zndroid.dm.FactoryModel.MethodFactory.opration.impl;
import com.zndroid.dm.FactoryModel.MethodFactory.opration.Operation;
/**
* Created by luzhenyu on 2016/8/22.
*/
public class SubOpration extends Operation {
@Override
public double getResult() {
return numA - numB;
}
}
抽象工厂类:用于创建对应操作工厂
package com.zndroid.dm.FactoryModel.MethodFactory;
import com.zndroid.dm.FactoryModel.MethodFactory.opration.Operation;
/**
* Created by luzhenyu on 2016/8/19.
*/
public interface IMethodFactory {
Operation createOpration();
}
具体工厂类:用于实现创建何种工厂
package com.zndroid.dm.FactoryModel.MethodFactory.implFact;
import com.zndroid.dm.FactoryModel.MethodFactory.IMethodFactory;
import com.zndroid.dm.FactoryModel.MethodFactory.opration.Operation;
import com.zndroid.dm.FactoryModel.MethodFactory.opration.impl.AddOpration;
/**
* Created by luzhenyu on 2016/8/19.
*/
public class AddFactory implements IMethodFactory {
@Override
public Operation createOpration() {
return new AddOpration();
}
}
package com.zndroid.dm.FactoryModel.MethodFactory.implFact;
import com.zndroid.dm.FactoryModel.MethodFactory.IMethodFactory;
import com.zndroid.dm.FactoryModel.MethodFactory.opration.Operation;
import com.zndroid.dm.FactoryModel.MethodFactory.opration.impl.SubOpration;
/**
* Created by luzhenyu on 2016/8/22.
*/
public class SubFactory implements IMethodFactory {
@Override
public Operation createOpration() {
return new SubOpration();
}
}
具体使用:
log("----------------我是分割线-----------------");
IMethodFactory addFactory = new AddFactory();
com.zndroid.dm.FactoryModel.MethodFactory.opration.Operation addOperation = addFactory.createOpration();
addOperation.setNumA(444);
addOperation.setNumB(222);
log(addOperation.getResult() + "");
IMethodFactory subFactory = new SubFactory();
com.zndroid.dm.FactoryModel.MethodFactory.opration.Operation subOperation = subFactory.createOpration();
subOperation.setNumA(444);
subOperation.setNumB(222);
log(subOperation.getResult() + "");
log("========================================");
【欢迎上码】
【微信公众号搜索 h2o2s2】