工厂方法

Posted zhouxuan-c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂方法相关的知识,希望对你有一定的参考价值。

定义

定义一个创建对象的接口。但让实现这个接口的类,来决定实例化哪个类。
工厂方法让类的实例化推迟到子类中进行。

类型

创建型

适用场景

  1. 创建对象需要大量的代码
  2. 客户端(应用层代码)不依赖于产品类实例如何被创建、实现等细节
  3. 一个类通过其子类来指定创建哪个对象

优点

  1. 用户只需关心所需产品对应的工厂,无需关心创建细节
  2. 加入新产品符合开闭原则,提高可扩展性

缺点

  1. 类的数量过多,增加复杂度(添加新产品时,需要加上产品类与其对应的工厂类)
  2. 增加了系统的抽象性和理解难度

Coding

实现工厂方法

技术图片

// 对于某些行为、属性是已知时, 使用抽象类
// 均为未知时, 可以使用接口
public abstract class VideoFactory {
    public abstract Video getVideo();
}
public class JavaVideoFactory extends VideoFactory {
    @Override
    public Video getVideo() {
        return new JavaVideo();
    }
}
// 具体产生什么, 由子类决定, 不会由 VideoFactory 决定
// VideoFactory 只定义规范、契约,不决定产生什么
public class PythonVideoFactory extends VideoFactory {
    @Override
    public Video getVideo() {
        return new PythonVideo();
    }
}
public class Test {

    public static void main(String[] args) {
        VideoFactory videoFactory = new JavaVideoFactory();
        // 想要 Python 的,只要把工厂重新指向 Python 工厂就行了
        //  VideoFactory videoFactory = new PythonVideoFactory();

        Video video = videoFactory.getVideo();
        video.produce();
    }

}

对比简单工厂

如果此时需要加上 FEVideo,在简单方法的实现中,就需要在工厂中,再新增一个 if 了

        // 优雅吗??
        if ("java".equalsIgnoreCase(type)) {
            return new JavaVideo();
        } else if ("python".equalsIgnoreCase(type)) {
            return new PythonVideo();
        } else if ("fe".equalsIgnoreCase(type)) {
            return new FEVideo();
        }
        return null;

在工厂方法中,当需要新增 FEVideo 时,我们只需要创建 FEVideo 和 FEVideoFactory。

以上是关于工厂方法的主要内容,如果未能解决你的问题,请参考以下文章

一. 抽象工厂&工厂方法&简单工厂方法

设计模式之工厂方法和抽象工厂

C++工厂模式(简单工厂工厂方法抽象工厂)

C++工厂模式(简单工厂工厂方法抽象工厂)

VSCode自定义代码片段—— 数组的响应式方法

工厂方法与抽象工厂