一文学透设计模式——工厂模式

news2024/9/21 0:32:31

在这里插入图片描述

工厂模式

概念

牛马人生公司最近开启了线上直播,直播中牛马人生公司宣称他们建造了一家世界上最为先进的工厂,任何人只要去到工厂面前,告诉工厂你要什么牌子的汽车,工厂就会给你一辆什么牌子的汽车。

这引起了粉丝朋友的注意,纷纷来到工厂一探究竟。

实现步骤

下面我们用代码来表示这个逻辑。

  1. 牛马人生公司重新定义了汽车的概念,他在幼儿园发出了100份的问卷调查,得到了汽车的定义,以及该拥有的功能。

    /**
     * 汽车的接口定义
     *
     * @author wanggt
     * @date 2023-06-17 20:45:27
     */
    public interface Car {
    
        /**
         * 往前走
         *
         * @author wanggt
         * @date 2023-06-17 20:46:21
         */
        void run();
    }
    
  2. 得到了汽车的最先进的概念之后,牛马人生公司开始设计一个拥有世界上最先进理念的工厂,一家可以制造任何汽车的工厂。在牛马人生公司的设想中,最开始支持的是五菱神车和小鹏汽车。

    /**
     * 汽车工厂类
     *
     * @author wanggt
     * @date 2023-06-17 20:51:13
     */
    public class CarFactory {
    
        /**
         * 在汽车工厂里根据汽车名称提车。
         *
         * @param name 汽车名称
         *
         * @author wanggt
         * @date 2023-06-17 21:00:09
         */
        public static Car getCar(String name) {
            if ("五菱".equals(name)) {
                return new WuLingCar();
            } else if ("小鹏".equals(name)) {
                return new XiaoPengCar();
            } else {
                return null;
            }
        }
    }
    
  3. 但是牛马人生公司并不知道汽车的制造方法,所以找到了小鹏和五菱的汽车厂商,学习了汽车的制造技术,以及授权。

    /**
     * 五菱神车
     *
     * @author wanggt
     * @date 2023-06-17 20:57:00
     */
    public class WuLingCar implements Car {
    
        @Override
        public void run() {
            System.out.println("五菱神车,送货载人都可以,我跑得飞快");
        }
    }
    
    /**
     * 小鹏汽车。
     *
     * @author wanggt
     * @date 2023-06-17 20:58:05
     */
    public class XiaoPengCar implements Car {
    
        @Override
        public void run() {
            System.out.println("小鹏汽车走啊走");
        }
    }
    
  4. 粉丝应邀而来,来到工厂前面,果然想要有啥车,工厂就会给啥车。只不过工厂的工程师说,目前工厂支持的车的类型还不多,后面会继续扩展的。

    public class SimpleFactoryDemo {
    
        public static void main(String[] args) {
            Car xiaoPengCar = CarFactory.getCar("小鹏");
            xiaoPengCar.run();
    
            System.out.println("===========");
    
            Car wuLingCar = CarFactory.getCar("五菱");
            wuLingCar.run();
        }
    }
    
    小鹏汽车走啊走
    ===========
    五菱神车,送货载人都可以,我跑得飞快
    

优缺点分析

我们来分析下牛马人生公司的这个工厂。其实他就是使用了简单工厂模式

优点是:减少了买一辆车的复杂性,我不需要知道汽车里面的构造是怎么样的,也不需要知道什么牌子的汽车就要到哪里去买车。顾客只需要告诉一个名字,这个工厂都可以给客户心目中的汽车。而且未来这个工厂还可以生产越来越多类型的汽车。

缺点呢,工厂的总工程师才不会告诉你,外表看起来光鲜亮丽的汽车工厂,里面是多么的杂乱。因为要制造的汽车类型太多了,每种汽车又有不同的配件。工厂已经不堪重负了。支持的汽车牌子越多,工厂里面就越混乱。

改进方案

日子一天天过去,汽车工厂兼容的汽车类型越来越多,工人们不得不连轴转。而且因为汽车工厂支持的汽车类型太多了,工厂里结构变得异常的复杂。而且性能也越来越低。

新招了一个设计师,刚进到工厂就辞职了。他说他就没有见过这么复杂的结构。

汽车工厂的总工程师想,这么下去可不行啊,全天下有多少汽车类型啊,要是都兼容了,那工厂估计吃不消啊。

于是,在总工程师薅掉了最后一根头发之后,想到了解决办法。

他可以使用工厂方法模式来改造工厂。虽然也是工厂模式,但是工厂方法模式有效避免了修改现有的工厂。可以减少修改,而通过扩展的方式来达到目的。这就是所谓的开闭原则

总工程师得意地想,姜还是老的辣。

重新设计之后的汽车工厂如下所示:

  1. 汽车的概念还是一样的。

    /**
     * 汽车的接口定义
     *
     * @author wanggt
     * @date 2023-06-17 20:45:27
     */
    public interface Car {
    
        /**
         * 往前走
         *
         * @author wanggt
         * @date 2023-06-17 20:46:21
         */
        void run();
    }
    
  2. 总工程师增加了一个汽车工厂的设计规范。这里就是跟之前不同的地方。

    /**
     * 汽车工厂类的接口定义。
     *
     * @author wanggt
     * @date 2023-06-17 20:51:13
     */
    public interface CarFactory {
    
        /**
         * 在汽车工厂里根据汽车名称提车。
         *
         * @author wanggt
         * @date 2023-06-17 21:00:09
         */
        Car getCar();
    }
    
  3. 根据汽车的设计规范,打造了一个专门生产五菱神车的工厂。

    /**
     * 汽车工厂类
     *
     * @author wanggt
     * @date 2023-06-17 20:51:13
     */
    public class WuLingCarFactory implements CarFactory {
    
        /**
         * 在汽车工厂里根据汽车名称提车。
         *
         * @author wanggt
         * @date 2023-06-17 21:00:09
         */
        @Override
        public Car getCar() {
            return new WuLingCar();
        }
    }
    
    /**
     * 五菱神车
     *
     * @author wanggt
     * @date 2023-06-17 20:57:00
     */
    public class WuLingCar implements Car {
    
        @Override
        public void run() {
            System.out.println("五菱神车,送货载人都可以,我跑得飞快");
        }
    }
    
  4. 同样,又打造了一个小鹏汽车的工厂。

    /**
     * 汽车工厂类
     *
     * @author wanggt
     * @date 2023-06-17 20:51:13
     */
    public class XiaoPengCarFactory implements CarFactory {
    
        /**
         * 在汽车工厂里根据汽车名称提车。
         *
         * @author wanggt
         * @date 2023-06-17 21:00:09
         */
        @Override
        public Car getCar() {
            return new XiaoPengCar();
        }
    }
    
    /**
     * 小鹏汽车。
     *
     * @author wanggt
     * @date 2023-06-17 20:58:05
     */
    public class XiaoPengCar implements Car {
    
        @Override
        public void run() {
            System.out.println("小鹏汽车走啊走");
        }
    }
    
  5. 粉丝听闻汽车工厂大改造,又来到汽车工厂来围观。发现了汽车工厂的似乎比以前要复杂了,还需要知道小鹏汽车工厂,五菱汽车工厂。纷纷有些不满,但总算还在意料之内。

    public class FactoryMethodDemo {
    
        public static void main(String[] args) {
            XiaoPengCarFactory xiaoPengCarFactory = new XiaoPengCarFactory();
            Car xiaoPengCar = xiaoPengCarFactory.getCar();
            xiaoPengCar.run();
    
            System.out.println("===========");
            WuLingCarFactory wuLingCarFactory = new WuLingCarFactory();
            Car wuLingCar = wuLingCarFactory.getCar();
            wuLingCar.run();
        }
    }
    
  6. 总工程师松了一口气,以后总算不用担心兼容新的汽车了。只要新建一个对应的工厂就可以生产新的汽车了。

可以看出来,简单工厂模式胜在简单,一个工厂类,一个静态方法就可以获取各种对象。工厂方法模式扩展性比较强,而且满足开闭原则。

选择使用哪一个,主要是看简单不简单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/835353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

App Cleaner Uninstaller for Mac 苹果电脑软件卸载工具

App Cleaner & Uninstaller 是一款非常有用的 Mac 应用程序清理和卸载工具。它可以彻底地清理系统中的应用程序、扩展和残留文件,以释放磁盘空间并优化系统性能。 此外,它还提供了磁盘空间监控和智能清理建议等功能,使用户可以轻松地管理…

Java自定义校验注解实现List、set集合字段唯一性校验

文章目录 一: 使用场景二: 定义FieldUniqueValid注解2.1 FieldUniqueValid2.2 注解说明2.3 Constraint 注解介绍2.4 FieldUniqueValid注解使用 三:自定义FieldUniqueValidator校验类3.1 实现ConstraintValidator3.2 重写initialize方法3.3 重…

解决mvn clean install遇到testng单元测试失败时打包也失败的问题

解决mvn clean install遇到testng单元测试失败时打包也失败的问题 看这个之前请先看这个 Jenkins执行Testng 比如我现在就有一个单元测试失败的项目 执行mvn clean install的时候就会报错 下面是我现在的pom.xml 但我们不希望这样&#xff0c;怎么办 <plugin><gr…

【Vs Code】如何配置保存cpolar所建立的隧道参数?

文章目录 &#x1f4cb; 前言1.如何配置保存cpolar所建立的隧道参数&#xff1f;2.本地安装 VS Code并修改隧道参数2.1 Visual studio Code 下载2.2 配置Visual studio Code 相关参数2.3 编辑 cpolar.yml 隧道参数文件2.3 修改website隧道参数 3. 检查 cpolar.yml 文件配置是否…

2023年 Java 面试八股文(20w字)

目录 第一章-Java基础篇 1、你是怎样理解OOP面向对象 难度系数&#xff1a;⭐ 2、重载与重写区别 难度系数&#xff1a;⭐ 3、接口与抽象类的区别 难度系数&#xff1a;⭐ 4、深拷贝与浅拷贝的理解 难度系数&#xff1a;⭐ 5、sleep和wait区别 难度系数&a…

苹果提交审核出现“您的 App 包含 NSUserTrackingUsageDescription...”解决办法

您的 App 包含 NSUserTrackingUsageDescription&#xff0c;这表示您将会请求追踪用户。要在 App 产品页上更新此信息&#xff0c;您必须注明哪些数据类型会追踪用户。如果此描述有误&#xff0c;请更新您的 App 二进制文件&#xff0c;并将新的构建版本上传到 App Store Conne…

飞凌嵌入式「国产」平台大盘点(一)瑞芯微系列

“国产化”一词正在被越来越多的提及&#xff0c;有着越来越高的关注度&#xff0c;飞凌嵌入式也已与多家国内芯片原厂联合推出了数款国产化智能平台。为了帮助大家快速认识飞凌嵌入式推出的各系列国产核心板产品&#xff0c;小编将以芯片品牌进行分类带大家一起盘点。 本篇文…

注释//TODO的作用

// TODO用来标记某处&#xff0c;表示该处含有待办事项&#xff08;尚未解决&#xff09;。其设计本意只是提醒开发者注意&#xff0c;除了代码高亮之外&#xff0c;还可以借助编辑器实现快速定位。 如何使用 直接在 双斜杠后面加 TODO 或者 todo 即可&#xff0c;大小写不敏感…

加拿大量子研究新动作!D-Wave与滑铁卢大学合作研究量子相干性

​ &#xff08;图片来源&#xff1a;网络&#xff09; D-Wave是量子计算系统、软件和服务的领导者&#xff0c;也是量子计算机的第一家供应商。近期&#xff0c;D-Wave宣布与滑铁卢大学量子计算研究所&#xff08;IQC&#xff09;达成两项新合作。他们为量子计算系统建立了关键…

【Spring Cloud 五】OpenFeign负载均衡

这里写目录标题 系列文章目录背景一、OpenFeign是什么Feign是什么Feign的局限性 OpenFeign是什么 二、为什么要有OpenFeign三、如何使用OpenFeign服务提供者order-servicepom文件yml配置文件启动类实体ParamController 服务消费者user-servicepom文件yml配置文件启动类接口类Us…

嵌入式该往哪个方向发展?

1. 你所在的城市嵌入式Linux岗位多吗&#xff1f;我觉得这是影响你做决定的另一个大问题。我们学嵌入式Linux这门技术&#xff0c;绝大部分人是为了从事相关的工作&#xff0c;而不是陶冶情操。但是根据火哥统计来看&#xff0c;嵌入式Linux的普遍薪资虽然高于单片机&#xff0…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 28 日论文合集)

文章目录 一、检测相关(11篇)1.1 Adaptive Segmentation Network for Scene Text Detection1.2 EFLNet: Enhancing Feature Learning for Infrared Small Target Detection1.3 MIM-OOD: Generative Masked Image Modelling for Out-of-Distribution Detection in Medical Image…

CSS中所有选择器详解

文章目录 一、基础选择器1.标签选择器2.类选择器3.id选择器4.通配符选择器 二、复合选择器1.交集选择器2.并集选择器 三、属性选择器1.[属性]2.[属性属性值]3.[属性^属性值]4.[属性$属性值]5.[属性*属性值] 四、关系选择器1.父亲>儿子2.祖先 后代3.兄弟4.兄~弟 五、伪类选择…

NTT DATA利用相干伊辛机模拟基因组组装和疾病治疗的潜力

​ &#xff08;图片来源&#xff1a;网络&#xff09; 7月20日&#xff0c;日本领先的IT服务提供商和行业咨询公司NTT DATA宣布完成了一个使用量子计算优化基因组组装过程的项目。这是量子计算应用于医疗保健和生命科学行业中的一个里程碑。 本项目通过比较量子和非量子计算方…

Ubuntu18.04 安装opencv 4.8.0教程(亲测可用)

1. 安装准备 安装前需要下载一些必须的依赖项。 不同版本opencv依赖会有不同&#xff0c;具体见官网opencv安装 sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-…

Elasticsearch官方测试数据导入

一、数据准备 百度网盘链接 链接&#xff1a;https://pan.baidu.com/s/1rPZBvH-J0367yQDg9qHiwQ?pwd7n5n 提取码&#xff1a;7n5n文档格式 {"index":{"_id":"1"}} {"account_number":1,"balance":39225,"firstnam…

(附代码)视觉激光雷达信息融合与联合标定

目录 一、引言 福利&#xff1a;文末有chat-gpt纯分享&#xff0c;无魔法&#xff0c;无限制 二、联合标定转换关系 三、相机标定 四、联合标定 五、视觉与点云信息融合 5.1 image2points 5.2 points2image 六、总结 一、引言 最近在为车辆添加障碍物检测模块&#xf…

【雕爷学编程】MicroPython动手做(31)——物联网之Easy IoT

1、物联网的诞生 美国计算机巨头微软(Microsoft)创办人、世界首富比尔盖茨&#xff0c;在1995年出版的《未来之路》一书中&#xff0c;提及“物物互联”。1998年麻省理工学院提出&#xff0c;当时被称作EPC系统的物联网构想。2005年11月&#xff0c;国际电信联盟发布《ITU互联网…

Nginx源码安装

文章目录 Nginx源码安装注安装pcre库安装openssl库创建用户及用户组安装编译环境解压文件检测环境重要目录检查配置服务启动脚本查看效果&#xff1a; Nginx源码安装 注 本实验基于RHEL73.10.0-327.el7.x86_64&#xff0c;尽量使用RHEL7或CentOS7。 安装pcre库 安装 pere 库…

(自控原理)线性系统的根轨迹法

目录 一、根轨迹法的基本概念 1、根轨迹概念 2、根轨迹方程 二、根轨迹绘制的基本法则 1、绘制根轨迹基本法则 三、系统性能的分析 1、闭环零点与时间响应 一、根轨迹法的基本概念 1、根轨迹概念 三大分析矫正方法&#xff1a;时域法、复域法(根轨迹法)、频域法 2、根…