定义:
定义一个用于创建对象的接口,让子类来决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
它是简单工厂模式的一种延伸。
例子:
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的耦合。