设计模式---工厂方法模式

本文详细介绍了工厂方法模式的概念及其应用场景,包括如何通过该模式实现对象的灵活实例化,以及在何种情况下采用简单工厂模式或多工厂模式更为合适。此外,还探讨了工厂方法模式在实际项目中的应用案例。

定义

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

通用模版

产品:


抽象工厂:

具体工厂:

场景:

应用场景

  • 工厂方法模式是new一个对象的替代。
  • 需要灵活的、可扩展的框架时,可考虑此模式。
  • 异构项目中使用。(WebService与一个非Java项目交互)
  • 测试驱动开发框架。(JMock或者EasyMock替代)

扩展

1、缩小为简单工厂模式
场景:一个模块只需要一个工厂类。
解决:使用静态类型替代抽象工厂类。
修改模版:删除抽象工厂类Creator、修改ConcreteCreator类,如下图:


2、升级为多个工厂类
场景:初始化一个对象很耗费精力时,所有的产品类放入一个工厂方法中初始化会使代码结构不清。
解决:为每个产品定义一个创造者,由调用者选择与哪个工厂方法关联。(复杂应用中添加一个协调类,封装子工厂类,对高层提供统一访问接口,避免调用者与各子工厂类交流)
修改模版:
  • 修改抽象工厂类

  • 修改具体工厂类(可以创建多个具体工厂类)
/**
 * 具体工厂类(多工厂模式)
 * @author Carol
 *
 */
public class ConcreteCreator1 extends Creator {
	public <T extends Product> T createProduct(){
		return new Product1();

3、替代单例模式
场景:使用工厂方法模式替代单例模式
代码:
     
工厂类:
 

4、延迟初始化
场景:一个对象被消费完毕后,并不立即释放,工厂类保持其初始状态,等待再次被使用。(例如:JDBC连接数据库)
解决:ProductFactory负责产品类对象创建工作,并且通过prMap变量产生一个缓存,对需要重用的对象保存。
代码:
/**
 * 延迟加载的工厂类
 * @author Carol
 *
 */
public class ProductFactory {
	private static final Map<String,Product> prMap = new HashMap();
	public static synchronized Product createProduct(String type) throws Exception{
		Product product = null;
		//如果map中有这个对象了
		if(prMap.containsKey(type)){
			product = prMap.get(type);
		}else{
			if(type.equals("product1"))
			{
				product = new ConcreteProduct1();
			}else{
				product = new ConcreteProduct2();
			}
			//将对象放入缓存容器中
			prMap.put(type, product);
		}
		return product;
		
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值