设计模式学习总结-工厂方法模式

从简单工厂方法模式到工厂方法模式

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

工厂方法模式定义

一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

代码示例
下面以简单工厂方法中提到的计算器的例子来用代码示例:
工厂类

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)注入到客户端中,这样连调用处的代码也不用修改了,只需要在配置文件中修改一下配置信息就行了。这样,整个程序就实现了源代码完全无修改的可扩展。

Leave a Comment.