简单工厂
最后更新于:2022-08-13 13:07:29
定义
由一个工厂对象决定创建出哪一种产品类的实例
类型
创建型,但不属于GOF23中设计模式
使用场景
- 工厂类负责创建的对象比较少
- 客户端(应用端)只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心
优点
只需要传入一个正确的参数,就可以获取你所需要的对象,而无需知道其创建的细节。
去商店买杯咖啡,那么只需要把咖啡给我就行
缺点
工厂类的职责相对过重,增加新的产品,需要修改工厂类的判断逻辑,违背开闭原则。
代码
场景
一个学习网站上有各种的视频,首先先创建一个视频类video
public abstract class Video {
// 生产视频的方法
public abstract void produce();
}
创建不同的视频类
public class JavaVideo extends Video{
@Override
public void produce() {
System.out.println("学习Java课程视频");
}
}
public class PythonVideo extends Video{
@Override
public void produce() {
System.out.println("学习Python课程视频");
}
}
测试
public class Test {
public static void main(String[] args) {
Video video = new JavaVideo();
video.produce();
}
}
结果
学习Java课程视频
当我们需要不同视频时,就需要修改为不同的类,而且需要import不同的包。而如何让应用层不依赖不同的类,把整个的生产过程放到一个类里面,使应用层不依赖具体实现类。这就简单工厂的由来。
创建视频的简单工厂
public class VideoFactory {
public Video getVideo(String type) {
if ("java".equalsIgnoreCase(type)) {
return new JavaVideo();
} else if ("python".equalsIgnoreCase(type)) {
return new PythonVideo();
}
return null;
}
}
简单测试
public class Test {
public static void main(String[] args) {
VideoFactory videoFactory = new VideoFactory();
Video video = videoFactory.getVideo("java");
if (video == null)
return;
video.produce();
}
}
可以看出,应用层只依赖videoFactory,而由他来实现具体的视频类,所有的生产过程都在这个类中,应用层直接使用即可。