设计模式 简单工厂

概念

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

  • 适用场景:工厂类负责创建的对象比较少;应用层只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心

  • 优点:只需要传入一个正确的参数,就可以获取所需要的对象而无需知道其创建细节

  • 缺点:工厂类职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则

  • 简单工厂并不属于23种设计模式,其更像是一种编码风格和习惯

  • 使用简单工厂的一些类:Calendar、DriverManager、LoggerFactory


编码

实例

  • Video.java
/**
 * @Description 视频
 * @date Dec 20, 2021
 * @version 1.0
 */
public abstract class Video {

    /**
     * 生产方式
     */
    public abstract void produce();

}
  • JavaVideo.java
/**
 * @Description Java课程
 * @date Dec 20, 2021
 * @version 1.0
 */
public class JavaVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制Java课程视频");
    }
}
  • PythonVideo.java
/**
 * @Description Python课程
 * @date Dec 20, 2021
 * @version 1.0
 */
public class PythonVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制Python课程视频");
    }
}
  • Test.java
/**
 * @Description 测试类
 * @date Dec 20, 2021
 * @version 1.0
 */
public class Test {

    public static void main(String[] args) {
        Video video = new JavaVideo();
        video.produce();

        video = new PythonVideo();
        video.produce();
    }

}
  • 输出:
录制Java课程视频
录制Python课程视频
  • 类图如下:

在这里插入图片描述


简单工厂

  • 使应用层不依赖具体的实现类
  • VideoFactory.java
/**
 * @Description Video工厂
 * @date Dec 21, 2021
 * @version 1.0
 */
public class VideoFactory {

    /**
     * 获取Video
     * @param type
     * @return
     */
    public Video getVideo(String type) {
        if ("java".equalsIgnoreCase(type)) {
            return new JavaVideo();
        } else if ("python".equalsIgnoreCase(type)) {
            return new PythonVideo();
        }

        return null;
    }

}
  • Test.java
/**
 * @Description 简单工厂测试类
 * @date Dec 20, 2021
 * @version 1.0
 */
public class Test {

    public static void main(String[] args) {
        VideoFactory videoFactory = new VideoFactory();
        Video video = videoFactory.getVideo("java");
        if (video == null) {
            return;
        }
        video.produce();

        video = videoFactory.getVideo("python");
        if (video == null) {
            return;
        }
        video.produce();
    }

}
  • 输出:
录制Java课程视频
录制Python课程视频
  • 类图如下:

在这里插入图片描述

  • 具体的生产过程都放在在VideoFactory中,Test只管直接使用,但简单工厂的缺点体现无疑

反射

  • 利用反射从一定程度上满足开闭原则
  • VideoFactory.java
/**
 * @Description Video工厂
 * @date Dec 21, 2021
 * @version 1.0
 */
public class VideoFactory {

    /**
     * 获取Video
     * 利用反射从一定程度上满足开闭原则
     * @param c
     * @return
     */
    public Video getVideo(Class c) {
        Video video = null;
        try {
            video = (Video) Class.forName(c.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return video;
    }

}
  • Test.java
/**
 * @Description 简单工厂测试类
 * @date Dec 20, 2021
 * @version 1.0
 */
public class Test {

    public static void main(String[] args) {
        VideoFactory videoFactory = new VideoFactory();
        Video video = videoFactory.getVideo(JavaVideo.class);
        if (video == null) {
            return;
        }
        video.produce();

        video = videoFactory.getVideo(PythonVideo.class);
        if (video == null) {
            return;
        }
        video.produce();
    }

}
  • 输出:
录制Java课程视频
录制Python课程视频

源码


- End -
- 个人学习笔记 -

以上为本篇文章的主要内容,希望大家多提意见,如果喜欢记得点个推荐哦
作者:Maggieq8324
本文版权归作者和博客园共有,欢迎转载,转载时保留原作者和文章地址即可。
原文地址:https://www.cnblogs.com/maggieq8324/p/15713658.html