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

简单工厂模式是类的创建模式

假定有工厂,具体产品和抽象产品这三个元素存在,简单工厂模式就是由工厂类根据传入的参量决定创建出哪一种产品类的实例。简单工厂模式涉及到工厂角色抽象产品角色以及具体产品角色等三个角色:

工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体Java类实现。
抽象产品(Product)角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或他们共同拥有的接口。抽象产品角色可以用一个接口或者抽象类实现。
具体产品(Concreate product)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java类实现。



在这个示意图中,只显示了一个产品,但是具体当中一般会遇到多个具体产品的情况,关于这个情况我们完全可以自己考虑出解决实现方案。

















下面是计算器的一个简单工厂实现实例,我们定义Operation为计算接口(抽象产品),加减乘除子类(具体产品)必须实现这个接口的getResult(double a, double b)方法。而我们的工厂类负责根据输入返回特定的加减乘除产品。

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 SimpleFactory {
 
	public static Operation createOperation(char operate){
		Operation oper = null;
		switch (operate){
		case '+':
			oper = new OperationAdd();
			break;
		case '-':
			oper = new OperationSub();
			break;
		case '*':
			oper = new OperationMul();
			break;
		case '/':
			oper = new OperationDiv();
			break;
		}
		return oper;
	}
}
	public static void main(String[] args){
		double a = 8;
		double b = 2;
		Operation add = SimpleFactory.createOperation('/');
		double result = add.getResult(a,b);
		System.out.println(result);
	}



简单工厂模式的优点,模式的核心是工厂类。这个类含有必要的判断逻辑,可以决定在什么时候创建哪个实例。而客户端则可以免除直接创建产品对象的责任,而仅仅负责“消费”产品,简单工厂模式通过这种做法实现了对责任的分割。



简单工厂模式的缺点:当产品类有复杂的多层次等级结构时,工厂类只有它自己。以不变应万变,就是模式的缺点。这个工厂类集中了所有的产品创建逻辑,形成了一个无所不知的全能类,有人把这种类叫做“上帝类”。所以才引出了工厂方法模式,具体见下篇。

6 Comments on this Post.

  1. 一直在看你这个系列 不错噢 学习了 ^_^

  2. admin

    呵呵 你也认识Jackal啊 BYR? 幸会幸会

  3. 只是也订阅了他的博客 不是咯 uestc O(∩_∩)O~
    ps:你博客不能引用回复啊?

  4. admin

    呵呵 电子科大的 不错不错 貌似我没搞这个功能 = = 。。。。

  5. 设计的范围真广,架构,设计模式

Leave a Comment.