• 设计模式 简单工厂


    概念

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

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

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

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

    • 简单工厂并不属于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
    本文版权归作者和博客园共有,欢迎转载,转载时保留原作者和文章地址即可。
  • 相关阅读:
    nginx相关参考博客
    MySQL workbench8.0 CE基本用法(创建数据库、创建表、创建用户、设置用户权限、创建SQL语句脚本)
    MySQL Workbench基本操作
    idea导入(import)项目和打开(open)项目的区别
    [铁道部信息化管理]需求分析(一)—— 售票系统领域知识(区间票、订票、预留票)
    [铁道部信息化管理]核心业务需求及逻辑架构分析
    【spring boot 系列】spring data jpa 全面解析(实践 + 源码分析)
    OOAD-设计模式(一)概述
    TKmybatis的框架介绍和原理分析及Mybatis新特性
    国内程序员的十大疑问之一:为什么老外不愿意用MyBatis?
  • 原文地址:https://www.cnblogs.com/maggieq8324/p/15713658.html
Copyright © 2020-2023  润新知