结构图
模式说明
模式说明
- 扩展点是Operation的实现类,如果增加新的Operation实现类,需要修改工厂类OperationFactory,即在OperationFactory条件分支中增加新的判断类型。
- 使用反射技术的工厂类,可避免因增加Operation实现而需要修改工厂条件分支的缺点。
- 客户端需要知道使用哪个工厂类OperationFactory或者OperationFactoryExtended。
- 客户端不关心使用哪个Operation的实现类。
客户端
public static void main(String[] args) {
Operation oper = OperationFactory
.createOperation(OperationFactory.OperationType.ADD);
double result = oper.getResult(1.0, 2.0);
System.out.println(result);
oper = OperationFactoryExtended
.createOperation("creation.simple.factory.OperationAdd");
double result2 = oper.getResult(3.0, 4.0);
System.out.println(result2);
}
类设计
public final class OperationFactory {
public static enum OperationType {
ADD, SUB;
}
public static Operation createOperation(OperationType type) {
Operation oper = null;
if (type == OperationType.ADD) {
oper = new OperationAdd();
} else if (type == OperationType.SUB) {
oper = new OperationSub();
}
return oper;
}
}
public class OperationFactoryExtended {
/**
* use reflection to remove the IF clause
*
* @param qualifiedOperationName
* @return
*/
public static Operation createOperation(String qualifiedOperationName) {
try {
Class<Operation> clz = (Class<Operation>) Class
.forName(qualifiedOperationName);
return clz.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public interface Operation {
public double getResult(double numberA, double numberB);
}
public class OperationAdd implements Operation {
@Override
public double getResult(double numberA, double numberB) {
return numberA + numberB;
}
}
public class OperationSub implements Operation {
@Override
public double getResult(double numberA, double numberB) {
return numberA - numberB;
}
}