工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
在我介绍简单工厂模式的时候,写了一个例子,在那个例子中使用了一个工厂用于生成对应的操做类实例,然后返回。使用的是switch。。case语句,但是有一点不好,就是如果我们想要扩展那个例子就得修改这个核心工厂类,修改里面的switch。。case语句,这样违背了设计的开放----封闭原则。而使用工厂方法模式可以有效的解决这个为题,它不在需要核心工厂类了,而是对应每一个类建立一个工厂,然后在使用的时候实例对应的工厂,这样我们扩展的时候只要添加新的工厂和对应的类就可以了,不需要改变其他的代码。下面是使用工厂方法模式实现的计算器。
public abstract class Operation { double a; double b; abstract double getResult(); public void setA(double a) { this.a = a; } public void setB(double b) { this.b = b; } }
package com.mengxiangyue; public class OperationAdd extends Operation { @Override double getResult() { return a+b; } }
package com.mengxiangyue; public class OperationSub extends Operation { @Override double getResult() { return a-b; } }
package com.mengxiangyue; public interface IFactory { Operation createOperation(); }
package com.mengxiangyue; public class FactoryAdd implements IFactory { @Override public Operation createOperation() { return new OperationAdd(); } }
package com.mengxiangyue; public class FactorySub implements IFactory { @Override public Operation createOperation() { return new OperationSub(); } }
package com.mengxiangyue; public class Test { public static void main(String[] args) { IFactory f = new FactoryAdd(); Operation op = f.createOperation(); op.setA(34.6d); op.setB(34.2d); double x = op.getResult(); System.out.println(x); } }