工厂模式--工厂方法模式


工厂方法模式就是熟悉的工厂模式

在工厂方法模式中
不再提供一个统一的工厂来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供给一个与产品等级结构对应的工厂等级结构。

定义:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式(Factory Pattern),又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)。工厂方法模式是一种类创建型模式。

通俗来讲:
工厂方法模式提供一个抽象工厂接口来声明抽象工厂方法,而由其子类来具体实现工厂方法,创建具体的产品对象。

基本流程:

  • Factory
    抽象工厂中声明了工厂方法但并未实现工厂方法,交给其子类负责。
interface Factory {
    public Product factoryMethod();
}
  • ConcreteFactory
    在实际使用时,具体工厂类在实现工厂方法时除了创建具体产品对象之外,还可以负责产品对象的初始化工作以及一些资源和环境配置工作,例如连接数据库、创建文件等
class ConcreteFactory implements Factory {
    public Product factoryMethod() {
      
        // 可以做一些初始化工组
        
        return new ConcreteProduct();
    }
}

使用反射创建工厂对象
此时添加新的产品只需要:

  • 继承抽象产品类
  • 对应增加一个新的具体日志记录工厂,继承抽象工厂
  • 修改配置文件
  • 编译新增的具体产品类和具体工厂类,对原有的类库代码无须做任何的修改

适用场景:
(1) 客户端不知道它所需要的对象的类。在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建,可将具体工厂类的类名存储在配置文件或数据库中。
(2) 抽象工厂类通过其子类来指定创建哪个对象。在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。

不足:
工厂方法模式中的每个工厂只能生产一类产品,可能导致系统中存在大量的工厂类,势必会增加系统的开销,类的个数成对增加,增加系统的维护成本和运行开销。

参考作者:刘伟 http://blog.csdn.net/lovelion