英文:Factory Method
作为抽象工厂模式的孪生兄弟,工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,也就是说工厂方法模式让实例化推迟到子类。
大白话: 要实现哪个类,就new哪个类。
工厂方法模式非常符合“开闭原则”,当需要增加一个新的产品时,我们只需要增加一个具体的产品类和与之对应的具体工厂即可,无须修改原有系统。
同时在工厂方法模式中用户只需要知道生产产品的具体工厂即可,无须关系产品的创建过程,甚至连具体的产品类名称都不需要知道。虽然他很好的符合了“开闭原则”,但是由于每新增一个新产品时就需要增加两个类,这样势必会导致系统的复杂度增加。
其UML结构图:
工厂方法 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使得一个类的实例化延迟到了子类。
工厂方法在简单工厂的基础上再包了一层工厂,所有的工厂都是此工厂的子类。而产生对象的类型由子类工厂决定。使用工厂方法来实现上面的加减乘除对象的创建。
//定义上级工厂的接口
public interface IFractory {
public Operation generateOper();
}
//为每一个类创建工厂
/**
* 工厂方法 为每个对象生成一个工厂类
*/
public class AddOperationFactory implements IFractory{
@Override
public Operation generateOper() {
return new AddOperation();
}
}
public class SubOperationFactory implements IFractory {
@Override
public Operation generateOper() {
return new SubOperation();
}
}
public class MulOperationFactory implements IFractory {
@Override
public Operation generateOper() {
return new MulOperation();
}
}
public class DivOperationFactory implements IFractory {
@Override
public Operation generateOper() {
return new DivOperation();
}
}
//客户端代码
IFractory fractory = new AddOperationFactory();
Operation operation = fractory.generateOper();
operation.getResult(firstNum,secondNum);
工厂方法将类的实例化推迟到了其子类。
所以使用工厂方法模式时,需要客户端决定实例化哪一个工厂类。
选择判断问题还是存在的。也就是说,工厂方法把简单的工厂内部逻辑判断转移到了客户端来运行。你想要加的功能,本来是要改工厂类的,而现在是修改客户端。不过,我们在某些情况下通过工厂方法,只需要修改一行实例化的代码就可以实现系统元素的切换(比如切换数据源)。这也是很方便的。