工厂方法模式------ Factory Method
定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类
角色
- 接口工厂类
- 具体工厂类
- 抽象产品类
- 具体产品类
UML类图
工厂方法模式UML类图
代码
- Operation.java
public abstract class Operation {
private Long numberA;
private Long numberB;
public abstract long getResult();
public Long getNumberA() {
return numberA;
}
public void setNumberA(Long numberA) {
this.numberA = numberA;
}
public Long getNumberB() {
return numberB;
}
public void setNumberB(Long numberB) {
this.numberB = numberB;
}
}
- AddOperation.java
public class AddOperation extends Operation {
@Override
public long getResult() {
return getNumberA() + getNumberB();
}
}
其他三个Operation类似
- IFactoryMethod.java
public interface IFactoryMethod {
Operation createOperation();
}
- AddOperationFactory.java
public class AddOperationFactory implements IFactoryMethod {
@Override
public Operation createOperation() {
return new AddOperation();
}
}
其他三个工厂类似
- ClientTest.java
public class ClientTest {
public static void main(String[] args) {
IFactoryMethod factoryMethod = new AddOperationFactory();
Operation operation = factoryMethod.createOperation();
operation.setNumberA(99L);
operation.setNumberB(1L);
System.out.println(operation.getResult());
}
}
与简单工厂模式相比
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖,但当需要在增加一个产品的时候,就需要去工厂类中加上一个相应的逻辑判断(利用反射实现的不需要)去生产一个产品,这说明简单工厂不但对拓展开放了,对修改也开放了。违背了开放-封闭原则!
优点
- 1.隐藏了具体的创建产品的细节,客户端只需关心创建产品的工厂,甚至不需要知道具体产品的类名
- 2.当想新增产品时,无需修改抽象工厂,也无需修改其他具体工厂和具体产品,只需增加一个对应的具体工厂和具体产品即可,提高了系统的可拓展性,符合"开闭原则"
缺点
添加新产品时,需要新增产品工厂与具体产品类,增加了系统的复杂性,
适用场景
一个类不知道他需要的对象的类名,只需要知道对应的工厂即可。