设计模式5:工厂方法模式
在之前提到的简单方法模式中,如果需要给计算器添加一种运算,需要增加一个Operation子类,然后修改工厂类。
这样的设计一方面简化了客户端的修改,另一方面需要修改工厂类,这是违反开放-封闭模式的。
处理这种问题的另一种方法是工厂方法模式。
工厂方法模式克服了违反开放-封闭的缺点,同时保持了封装对象创建过程的优点,但是带来的缺点是,需要新增一个工厂类+修改客户端代码以实现功能扩展。
来看UML图:

四种运算的子类是继承了Operation基类,每个子类都有一个对应的工厂类,封装了创建其实例的过程。
代码:
Operation及其子类:
public abstract class Operation {
private double numA = 0;
private double numB = 0;
public double getNumA() {
return numA;
}
public void setNumA(double numA) {
this.numA = numA;
}
public double getNumB() {
return numB;
}
public void setNumB(double numB) {
this.numB = numB;
}
public abstract double getResult();
}
public class OperationAdd extends Operation {
@Override
public double getResult() {
return getNumA() + getNumB();
}
}
public class OperationDiv extends Operation {
@Override
public double getResult() {
// TODO Auto-generated method stub
return getNumA() / getNumB();
}
}
public class OperationMul extends Operation {
@Override
public double getResult() {
return getNumA() * getNumB();
}
}
public class OperationSub extends Operation {
@Override
public double getResult() {
// TODO Auto-generated method stub
return getNumA() - getNumB();
}
}
工厂接口和子类:
public interface IFactory {
public Operation createOperation();
}
public class AddFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationAdd();
}
}
public class SubFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationSub();
}
}
public class MulFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationMul();
}
}
public class DivFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationDiv();
}
}
Demo:
public class FactoryMethodDemo {
public static void main(String[] args) {
IFactory addFactory = new AddFactory();
Operation add = addFactory.createOperation();
add.setNumA(1.0);
add.setNumB(2.0);
System.out.println(add.getResult());
}
}
浙公网安备 33010602011771号