factory pattern

Concept: The factory pattern is responsible for instantiating a large number of classes with a common interface.

相关角色:
	抽象工厂:创建对象的具体工厂类必须实现这个接口
	具体工厂:实现了抽象工厂接口的具体工厂类
	抽象产品:创建的具体对象的超类型(父抽象类或父接口)
	具体产品:创建的具体对象。

1) Simple factory pattern (static factory method pattern):

	概念:新建一个工厂类,该工厂类有一个静态的工厂方法,根据这个静态工厂方法的入参来决定创建的对象是哪个类型。
		
	实现:
		// 工厂类
		public class Creator {
			
			// 静态工厂方法:根据入参condition来决定返回对象的类型。	
			public static ConcreteProduct factory(condition){
			
				if (condition 满足 条件A) {
					return new ConcreteProductA(); 		// 注:ConcreteProduct是ConcreteProductA和ConcreteProductB的超类
				} else if (condition 满足 条件B) {
					return new ConcreteProductB();
				} else {
					// 返回一个默认ConcreteProductX对象 或 直接抛出异常
				}
			}
		}
	
	缺点:新增类型(eg:ConcreteProductC)时,需要修改静态工厂方法,没有开闭原则的要求。

	举例:java.text.DateFormat的getDateInstance()方法。注:DateFormat这个工厂类,是通过重载getDateInstance()方法的方式来进行条件的判断。

2) Factory method pattern:

	概念:新建一个工厂接口(或工厂抽象类)、多个具体工厂类,所有的具体工厂类都实现了工厂接口中定义的工厂方法,每个具体工厂类只产生特定类型的对象。
	
	实现:
		// 抽象工厂
		public interface Creator {
			// 工厂方法
			public Product factory();
		}
	
		// 具体工厂ConcreteCreatorA 实现了工厂接口Creator
		public class ConcreteCreatorA implements Creator {
			// 工厂方法
			public Product factory() {
				return new ProductA();
			}
		}
		
		// 具体工厂ConcreteCreatorB 实现了工厂接口Creator
		public class ConcreteCreatorA implements Creator {
			// 工厂方法
			public Product factory() {
				return new ProductB();
			}
		}
	
	缺点:新增类型(eg:ProductC)时,需要新增对应的具体工厂,当类型较多时(具体工厂类也会随之增多),不容易维护。
	
	注意:
		工厂方法模式和模板方法模式的比较:
			1)二者都是基于方法的,都是将具体工作交给子类。
			2)工厂方法模式将创建的工作推延给子类,模板方法模式将剩余的逻辑交给子类。

	举例:java集合中的工厂模式:

		// 抽象工厂
		public interface List<E> extends Collection<E> {
			Iterator<E> iterator(); // 工厂方法
		}

		// 具体工厂
		public class ArrayList<E> implements List<E> {
			public Iterator<E> iterator() {
				return new Itr();	// java.util.Vector.Itr 实现了Iterator<E>接口
			}
		}

		// 具体工厂
		public class Vector<E> implements List<E> {
			public synchronized Iterator<E> iterator() {
				return new Itr();	// java.util.ArrayList.Itr 实现了Iterator<E>接口
			}
		}

3) Abstract factory pattern:

	概念:新建一个工厂接口(或工厂抽象类)、一个具体工厂类,这个具体工厂类实现了工厂接口中定义的多个工厂方法,故这个具体工厂类可以产生多种类型的对象。

	实现:
		// 抽象工厂:规定了多个工厂方法
		public interface Creator {
			
			// 创建A系列产品对象的工厂方法
			public ProductA factoryA();
			
			// 创建B系列产品对象的工厂方法
			public ProductB factoryB();
			
		}
	
		// 具体工厂:实现了抽象工厂的多个工厂方法
		public class ConcreteCreator implements Creator {
			
			// 创建A类产品对象的工厂方法
			public ProductA factoryA() {
				return new ProductA1(); 	// 注:ProductA1 implements ProductA
			}
			
			// 创建B类产品对象的工厂方法
			public ProductB factoryB() {
				return new ProductB1();		// 注:ProductB1 implements ProductB
			}
		
		}

	缺点:新增其它系列(eg:ProductC)的产品时,需要修改抽象工厂(在抽象工厂中添加新的工厂方法)。

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324531872&siteId=291194637