设计模式 一一一 工厂模式

工厂模式:

	概念:
		工厂模式负责将大量有共同接口的类实例化。
	
	相关角色:
		抽象工厂:创建对象的具体工厂类必须实现这个接口
		具体工厂:实现了抽象工厂接口的具体工厂类
		抽象产品:创建的具体对象的超类型(父抽象类或父接口)
		具体产品:创建的具体对象。
		
		
	1)静态工厂方法模式:

		概念:新建一个工厂类,该工厂类有一个静态的工厂方法,根据这个静态工厂方法的入参来决定创建的对象是哪个类型。
			
		实现:
			// 工厂类
			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)具体工厂方法模式:

		概念:新建一个工厂接口、多个具体工厂类,所有的具体工厂类都实现了工厂接口中定义的工厂方法,每个具体工厂类只产生特定类型的对象。
		
		实现:
			// 抽象工厂
			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)抽象工厂模式(又称为工具箱Toolkit):

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

		实现:
			// 抽象工厂:规定了多个工厂方法
			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)的产品时,需要在抽象工厂中添加新的工厂方法。
		说明:新增产品时,没有修改其它工厂方法的代码,故在"工厂方法"这个维度上满足了开闭原则。

		
		
		
		
		

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值