工厂方法模式

概述

《设计模式》中对工厂方法模式的意图描述如下:

定义一个创建对象的接口,让子类来决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类

一般工厂方法模式的类结构图如下所示:

FactoryMethod.png

其中,每个组件的介绍如下:

  • Product:产品实例对象的统一接口,及工厂方法创建的对象抽象
  • ConcreateProduct:实际的产品实例类
  • Createtor:声明工厂方法的组件,可以定义工厂方法的默认实现
  • ConcreateCreator:对 Creator 工厂方法重定义的实际子类

具体实例

假设现在需要制作一个应用程序框架,这个框架需要能够向用户显示多种文档,为了能够灵活地支持文档的扩展,因此对于处理文档的类来讲,它无法得知它具体会处理的文档类型。一个可行的方案是定义带有参数的处理方法来区别处理,但是这种方式和硬编码的方式并没有什么不同

而工厂方法模式提供了合适的解决方案,因为处理类无法知道处理的具体文档,因此我们可以提取文档的共性作为处理类能够处理的抽象类,而对于处理类来讲,则可以通过继承的方式来定义实际需要处理的文档类型,极大地提高了系统的灵活性

定义 Application 用于处理相关的文档, Document 表示文档的抽象,具体如下:

public abstract class Application {
    protected abstract Document createDocument();
    // 省略相关的文档处理操作
}

public interface Document {
    void open();
    void close();
}

假设现在系统需要添加对于 Text 文档的处理类,那么我们可以定义对应的具体子类:

public class TextDocument implements Document {
    // 省略具体的实现细节
}

public class TextApplication extends Application {
    @Override
    protected Document createDocument() {
        return new TextDocument();
    }
}

通过这种方式,现在 TextApplication 同样具备框架提供的文档处理操作

总结

使用工厂方法能够得到以下的一些优点:

  1. 结合模板方法模式,通过给子类提供钩子方法,提高了系统的可扩展性
  2. 工厂方法模式提高了高级抽象类之间的交互的可行性,使得对于特定应用的处理能够延伸到具体子类

和 “抽象工厂模式” 的联系:

  • “抽象工厂模式” 作用与类层次级别,而 “工厂方法模式” 作用于方法级别,二者的作用点不同
  • “抽象工厂模式” 中对于产品的生产,通常都是通过 “工厂方法模式” 来实现

参考:

[1] 《设计模式—可复用面向对象基础》

posted @ 2022-11-13 21:53  FatalFlower  阅读(27)  评论(0编辑  收藏  举报