定义:工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
类型:创建类模式
类图:
工厂方法实例(计算器):
package com.jin.model.simplefactory;
public abstract class Operation {
protected double number1;
protected double number2;
public double getNumber1() {
return number1;
}
public void setNumber1(double number1) {
this.number1 = number1;
}
public double getNumber2() {
return number2;
}
public void setNumber2(double number2) {
this.number2 = number2;
}
public abstract double getResult();
}
具体产品:
package com.jin.model.simplefactory;
public class OperationAdd extends Operation {
@Override
public double getResult() {
return number1 + number2;
}
}
package com.jin.model.simplefactory;
public class OperationSub extends Operation {
@Override
public double getResult() {
return number1 - number2;
}
}
乘法操作:
package com.jin.model.simplefactory;
public class OperationMul extends Operation {
@Override
public double getResult() {
return number1 * number2;
}
}
除法操作:
package com.jin.model.simplefactory;
public class OperationDiv extends Operation {
@Override
public double getResult() {
return number1 / number2;
}
}
抽象工厂类:
package com.jin.model.factorymethod;
public interface IFactory {
public Operation createOperation();
}
package com.jin.model.factorymethod;
public class AddFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationAdd();
}
}
减法工厂类:
package com.jin.model.factorymethod;
public class SubFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationSub();
}
}
乘法工厂类:
package com.jin.model.factorymethod;
public class MulFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationMul();
}
}
除法工厂类:
package com.jin.model.factorymethod;
public class DivFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationDiv();
}
}
客户端:测试
package com.jin.model.factorymethod;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
IFactory factory = new MulFactory();
Operation operation = factory.createOperation();
operation.setNumber1(2);
operation.setNumber2(4);
System.out.println(operation.getResult());
}
}
实现要点
1.Factory Method模式的两种情况:一是Creator类是一个抽象类且它不提供它所声明的工厂方法的实现;二是Creator是一个具体的类且它提供一个工厂方法的缺省实现。
2.工厂方法是可以带参数的。
3.工厂的作用并不仅仅只是创建一个对象,它还可以做对象的初始化,参数的设置等。
优点
1.用工厂方法在一个类的内部创建对象通常比直接创建对象更灵活。
2.Factory Method模式通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。
适用性
在以下情况下,适用于工厂方法模式:
1. 当一个类不知道它所必须创建的对象的类的时候。
2. 当一个类希望由它的子类来指定它所创建的对象的时候。
3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
总结
Factory Method模式是设计模式中应用最为广泛的模式,通过本文,相信读者已经对它有了一定的认识。然而我们要明确的是:在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。Factory Method要解决的就是对象的创建时机问题,它提供了一种扩展的策略,很好地符合了开放封闭原则。