代码改变世界

工厂模式之简单工厂模式

2015-08-04 16:47  你吃不吃麦芽糖  阅读(165)  评论(0)    收藏  举报

设计模式的目的其实就是封装,让客户端调用起来方便,同时让系统维护起来方便。今天记录一下对工厂模式的理解。

工厂模式专门负责将大量有共同接口的类实例化。

工厂模式有以下几种形态:

      1、简单工厂模式(Simple Factory):又称静态工厂方法模式(Static Factory Method Pattern)

      2、工厂方法模式(Factory Method):又称多态性工厂模式

      3、抽象工厂模式(Abstract Factory):又称工具箱模式

简单工厂模式

      简单工厂模式是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例,简单工厂模式的一个示意性系统中涉及的三个角色:工厂角色,抽象产品角色,具体产品角色。下面看一下一个示意性的源代码方便理解。

      首先是工厂角色的代码:

public class Creator {
	/**
	 * 静态工厂方法
	 */
	public static Product factory(String produceName) throws NoProductException{
		if(produceName.equalsIgnoreCase("ConcreteProduct1")){
			return new ConcreteProduct1();
		}
		else if(produceName.equalsIgnoreCase("ConcreteProduct2")){
			return new ConcreteProduct2();
		}
		else{
			throw new NoProductException("No Request Product");
		}
		
	}
}

 抽象产品角色代码:

public interface Product {}

 两个具体产品类代码:

public class ConcreteProduct1 implements Product {
	public ConcreteProduct1(){
		System.out.println("get product1");
	}
}

public class ConcreteProduct2 implements Product{
	public ConcreteProduct2(){
		System.out.println("get product2");
	}
}

 下面是异常类代码:

public class NoProductException extends Exception {
	public NoProductException(String msg){
		super(msg);
	}
}

 最后是客户端调用代码:

public class Client {
	public static void main(String[] args) {
		try {
			Creator.factory("ConcreteProduct1");
			Creator.factory("ConcreteProduct2");
			Creator.factory("ConcreteProduct3");
		} catch (NoProductException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 整个流程很简单,客户端调用工厂类的静态方法来得到具体的产品,如何调用的产品工厂没有,则抛出异常。

简单工厂模式的优点

      模式的核心是工厂类。这个类有必要的判断逻辑,决定在什么时候创建哪一个产品类的实例。客户端可以免除直接创建产品对象的责任,而仅仅负责"消费产品"。简单工厂模式通过这种做法实现了责任的分割。客户端相对独立于产品创建的过程,在系统引入新产品的时候无需修改客户端。

简单工厂模式的缺点

  一个很明显的缺点是,增加新产品则意味着我们要修改这个工厂类的源代码。

关于工厂模式的介绍请阅读下一篇:工厂模式之工厂方法模式