工厂方法模式(Factory Method)
程序员文章站
2022-06-15 14:22:01
...
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
工厂方法模式结构图
工厂方法模式实现简单工厂模式时的计算器
工厂方法模式实现简单工厂模式时的计算器结构图
工厂代码实现
构建工厂接口
/**
* 构建工厂接口
*/
public interface IFactory {
Operation CreateOperation();
}
为各运算创建一个具体的工厂去实现这个接口,各运算类与简单工厂相同
/**
* 为各运算创建一个具体的工厂去实现这个接口
*/
public class AddFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new Add();
}
}
public class SubFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new Sub();
}
}
public class DivFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new Div();
}
}
public class MulFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new Mul();
}
}
//客户端
IFactory operFac = new MulFactory();
Operation Oper = operFac.CreateOperation();
oper.setNumberA=1;
oper.setNumberB = 2;
Double result = oper.getResult();
简单工厂和工厂方法的区别
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。就像计算器,客户端不需知道该用哪个类的实例,只需要把“+”给工厂,工厂自己就可以创建相应的实例,客户端只要去做运算就行了,不同的运算要的实例不同。但是,如果要增加一个功能(求M的N次方),我们就需要增加“case”的分支条件,这样,我们的代码支持了扩展,也支持了修改,这就违背了开发-封闭原则。
既然简单工厂类与分支耦合,就对它下手,根据依赖倒转原则,把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后所有的要生产具体类的工厂就去实现这个接口,这样,一个简单工厂模式的工厂类变成了一个工厂抽象接口和多个具体生成的对象的工厂,于是当我们要添加功能的时候,就不需要修改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了。
工厂方法模式实现时,客户端需要决定实例化哪一个工厂类实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。当你想要增加功能的时候,本来是改工厂类,而现在是修改客户端。
工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。工厂方法模式是简单工厂模式的进一步抽象和推广。