一,定义
工厂方法模式:是粒度很小的设计模式,因为模式的表现只是一个抽象的方法。提前定义用于创建对象的接口,让子类决定实例化具体的某一个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现。
二,实例
我们以简单工厂模式中的运算实例来继续作为例子。
以下是工厂方法模式的接口图,明显可以看出和简单工厂模式的区别
public interface IFactory {
//工厂方法模式 基于 简单工厂中的加减乘除运算来
Operation createOperation(); //创建一个运算
}
public class AddOperationFactory implements IFactory {
@Override
public Operation createOperation() {//加法工厂,创建加法运算
return new OperationAdd();
}
}
public class SubOperationFactory implements IFactory {
@Override
public Operation createOperation() {//减法工厂,创建加法运算
return new OperationSub();
}
}
//测试
//简单工厂模式
Operation operation = OperationFactory.creatOperation("/");
operation.setNumA(1);
operation.setNumB(2);
System.out.println("getResult = " + operation.getResult());
/工厂方法模式
//IFactory factory = new AddOperationFactory();//加法工厂
IFactory factory = new SubOperationFactory();//减法工厂
//修改运算只需要修改 new 的工厂即可
Operation oper = factory.createOperation();
oper.setNumA(2);
oper.setNumB(3);
System.out.println("getResult = " + oper.getResult());
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算符类,选择判断的问题还是存在的,也就是说工厂方法把简单工厂的内部逻辑判断移到了客户端代码来了。你想要加功能,本来是改工厂类的,现在是改客户端代码。
三,总结
工厂方法模式克服了简单工厂模式违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。
简单工厂模式和工厂方法模式都是集中封装了对象的创建,使得要更换对象时,不需要做大的改动就可以实现,降低了客户程序和产品对象的耦合。
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了他的缺点。但缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开放量。
工厂模式根据抽象程度的不同分为三种:
- 简单工厂模式(也叫静态工厂模式)
- 工厂方法模式(也叫多形性工厂)
- 抽象工厂模式(也叫工具箱)
参考:《大话设计模式》