设计模式学习总结-工厂方法模式
从简单工厂方法模式到工厂方法模式
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
工厂方法模式定义
一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
代码示例
下面以简单工厂方法中提到的计算器的例子来用代码示例:
工厂类
public interface IFactory { public Operation createOperation(); } public class AddFactory implements IFactory{ public Operation createOperation(){ return new OperationAdd(); } } public class MulFactory implements IFactory{ public Operation createOperation(){ return new OperationMul(); } } public class SubFactory implements IFactory{ public Operation createOperation(){ return new OperationSub(); } } public class DivFactory implements IFactory{ public Operation createOperation(){ return new OperationDiv(); } } |
产品类
public interface Operation { public double getResult(double a, double b); } public class OperationAdd implements Operation{ public double getResult(double a, double b){ return a + b; } } public class OperationDiv implements Operation{ public double getResult(double a, double b){ return a / b; } } public class OperationMul implements Operation{ public double getResult(double a, double b){ return a * b; } } public class OperationSub implements Operation{ public double getResult(double a, double b){ return a - b; } } |
测试方法:
public class TestMain { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub double a = 8; double b = 2; IFactory addFac = new AddFactory(); Operation operAdd = addFac.createOperation(); double result = operAdd.getResult(a,b); System.out.println(result); } } |
工厂方法模式很好地遵循了开闭原则,实现了程序的可扩展。如果有新的产品需要生产,只需要新建一个具体工厂(实现工厂接口)来负责该产品的创建;由于所有代码都面向接口实现,调用者只需要知道具体工厂的名称即可(如代码中的new BuickFactory();),将具体产品(具体工厂)返回给抽象产品(抽象工厂),不需要修改被调用模块的源代码,调用模块也只需要修改具体工厂的类名,提高了可维护性。
另外,如果将具体工厂名称的信息通过Java反射机制或IOC方式(如Spring)注入到客户端中,这样连调用处的代码也不用修改了,只需要在配置文件中修改一下配置信息就行了。这样,整个程序就实现了源代码完全无修改的可扩展。