工厂方法
Posted zhouxuan-c
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂方法相关的知识,希望对你有一定的参考价值。
定义
定义一个创建对象的接口。但让实现这个接口的类,来决定实例化哪个类。
工厂方法让类的实例化推迟到子类中进行。
类型
创建型
适用场景
- 创建对象需要大量的代码
- 客户端(应用层代码)不依赖于产品类实例如何被创建、实现等细节
- 一个类通过其子类来指定创建哪个对象
优点
- 用户只需关心所需产品对应的工厂,无需关心创建细节
- 加入新产品符合开闭原则,提高可扩展性
缺点
- 类的数量过多,增加复杂度(添加新产品时,需要加上产品类与其对应的工厂类)
- 增加了系统的抽象性和理解难度
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。
以上是关于工厂方法的主要内容,如果未能解决你的问题,请参考以下文章