定义:
定义一个用于创建对象的接口,让子类来决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
它是简单工厂模式的一种延伸。
例子:
Spring中ApplicationContext的getBean方法就是典型的工厂方法模式。
工厂方法的通用代码:
产品抽象类
package _2FactoryMethodPattern;
public abstract class Product {
public void method1()
{
//处理业务逻辑
}
public abstract void method2();
}
产品实现类1
package _2FactoryMethodPattern;
public class SubProduct1 extends Product {
@Override
public void method2()
{
}
}
产品实现类2
package _2FactoryMethodPattern;
public class SubProduct2 extends Product {
@Override
public void method2()
{
}
}
工厂接口类
package _2FactoryMethodPattern;
public interface IProductFactory {
public <T extends Product> T createProduct(Class<T> c);
}
工厂实现类
package _2FactoryMethodPattern;
public class ProductFactory implements IProductFactory {
@SuppressWarnings("unchecked")
@Override
public <T extends Product> T createProduct(Class<T> c) {
Product p = null;
try {
p = (Product)Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T)p;
}
}
client类
package _2FactoryMethodPattern;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
IProductFactory factory = new ProductFactory();
Product product = factory.createProduct(SubProduct1.class);
// 继续业务逻辑
}
}
工厂方法模式的优点:
- 良好的封装性,代码结构清晰
- 工厂方法模式的扩张性非常优秀
- 屏蔽产品类
- 工厂方法模式是典型的解耦框架
工厂方法模式的应用场景
- 工厂方法模式是new一个对象的替代品,所以在需要生成对象的地方都可以使用,但是需要慎重的考虑是否需要增加一个工厂类进行管理,增加代码的复杂度。
- 需要灵活的、可扩展的框架时,可以考虑使用工厂方法模式。
- 可以使用在测试驱动开发的框架下。例如,测试一个类A,就需要把与类A有关联的类B也同时产生出来,我们可以使用工厂方法模式把类B虚拟出来,避免A和B的耦合。