简单工厂

定义
由一个工厂对象决定创建出哪一种产品类的实例

类型
创建型,但不属于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();
    }
}

UML

可以看出,应用层只依赖videoFactory,而由他来实现具体的视频类,所有的生产过程都在这个类中,应用层直接使用即可。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注