设计模式-工厂方法模式

来源:《设计模式之禅》

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

  1. 抽象产品类Product定义产品共性,实现对事物最抽象的定义。

  2. Creator定义抽象创建类,即抽象工厂。

  3. ConcreteCreator具体工厂,实现产品类的创建。

类图:

设计模式-工厂方法模式_第1张图片

代码:

抽象工厂类:

/**
 * 
 */
package cc.pattern.factory;

/**
 * @author rico
 * 抽象创建者
 */
public abstract class AbstractCreator {
	
	/**
	 * 定义创建产品方法
	 * @param clazz
	 * @return
	 */
	public abstract <T extends Product> T createProduct(Class<T> clazz);
}


具体工厂类:

/**
 * 
 */
package cc.pattern.factory;

/**
 * @author rico
 * 具体工厂创建类
 */
public class Creator extends AbstractCreator {

	/* (non-Javadoc)
	 * @see cc.pattern.factory.AbstractCreater#createProduct(java.lang.Class)
	 */
	@Override
	public <T extends Product> T createProduct(Class<T> clazz) {
		Object product = null;
		try {
			product = Class.forName(clazz.getName()).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return (T)product;
	}

}

抽象产品类:

/**
 * 
 */
package cc.pattern.factory;

/**
 * @author rico
 * 抽象产品类
 */
public abstract class Product {
	
	/**
	 * 产品公共方法
	 */
	public void commonMethod() {
		System.out.println("###Product.commonMethod...");
		
	}
	
	/**
	 * 产品抽象方法
	 */
	public abstract void action();
}

具体产品类:

/**
 * 
 */
package cc.pattern.factory;

/**
 * @author rico
 * 具体产品类
 */
public class ConcreteProduct extends Product {

	/* (non-Javadoc)
	 * @see cc.pattern.factory.Product#action()
	 */
	@Override
	public void action() {
		System.out.println("###ConcreteProduct.action...");
	}

}
/**
 * 
 */
package cc.pattern.factory;

/**
 * @author rico
 * 具体产品类
 */
public class ConcreteProduct2 extends Product {

	/* (non-Javadoc)
	 * @see cc.pattern.factory.Product#action()
	 */
	@Override
	public void action() {
		System.out.println("###ConcreteProduct2.action...");
	}

}

场景类:

/**
 * 
 */
package cc.pattern.factory;

/**
 * @author rico
 * 场景类
 */
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		AbstractCreator creator = new Creator();
		
		Product product1 = creator.createProduct(ConcreteProduct.class);
		product1.action();
		
		Product product2 = creator.createProduct(ConcreteProduct2.class);
		product2.action();
	}

}


工厂方法模式优点:

  1. 良好的封装性,代码结构清晰。

  2. 良好的扩展性。

  3. 屏蔽产品类。产品接口保持不变,上次模块就不会发生变化。

  4. 典型的解耦框架。

工厂方法模式缺点:

使用场景:

  1. 工厂方法模式是new一个对象的替代品,可以用于生产需要的对象,但是需要考虑是否要添加一个工厂类,增加代码的复杂度。

  2. 需要灵活,可扩展的框架时。定义一个工厂方法,根据传入的条件生存对应的对象。

  3. 工厂方法模式可以用于异构项目中。

  4. 可以使用在测试驱动开发框架下。

扩展:

  1. 缩小为简单工厂模式,去掉抽象工厂类,并把创建产品的方法定义为静态方法。

  2. 升级为多个工厂类,为每个产品定义一个创建者,由调用者决定选择哪个产品创建者。

  3. 代替单例模式。

  4. 延迟初始化。工厂负责对象的创建,并且通过Map保存一个缓存。


你可能感兴趣的:(设计模式-工厂方法模式)