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

在这里插入图片描述

工厂模式

概念

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

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

实现步骤

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

  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 {@Overridepublic void run() {System.out.println("五菱神车,送货载人都可以,我跑得飞快");}
    }
    
    /*** 小鹏汽车。** @author wanggt* @date 2023-06-17 20:58:05*/
    public class XiaoPengCar implements Car {@Overridepublic 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*/@Overridepublic Car getCar() {return new WuLingCar();}
    }
    
    /*** 五菱神车** @author wanggt* @date 2023-06-17 20:57:00*/
    public class WuLingCar implements Car {@Overridepublic 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*/@Overridepublic Car getCar() {return new XiaoPengCar();}
    }
    
    /*** 小鹏汽车。** @author wanggt* @date 2023-06-17 20:58:05*/
    public class XiaoPengCar implements Car {@Overridepublic 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.hqwc.cn/news/58518.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW开发高压航空航天动力系统爬电距离的测试

LabVIEW开发高压航空航天动力系统爬电距离的测试 更多电动飞机MEA技术将发电,配电和用电集成到一个统一的系统中,提高了飞机的可靠性和可维护性。更多的电动飞机使用更多的电能来用电动替代品取代液压和气动系统。对车载电力的需求不断增加,…

ATFX汇市:美联储年内或仍将加息依次,美指向下空间不大

环球汇市行情摘要—— 昨日,美元指数上涨0.08%,收盘在102.08点, 欧元贬值0.07%,收盘价1.1003点; 日元贬值0.51%,收盘价142.47点; 英镑升值0.28%,收盘价1.2784点; 瑞…

机器学习竞赛、CV/NLP 竞赛入门没人带解决办法

我的第一个AI竞赛是在Datawhale夏令营的帮助下参加的。 一周左右的夏令营,让我从环境都配不好的小白到对pytorch基本入门。 夏令营的氛围督促我赶紧学习,赶紧进步;夏令营群里的大佬推荐的入门视频让我pytorch入门。 了解datawhale是通过b站…

Docker使用

1.下载安装 在linux下安装docker一共有三步: 更新软件包列表 sudo apt-get update 安装docker sudo apt-get install docker-ce 检查docker是否安装成功 docker --version 更详细的docker安装可以参考ubuntu18.04安装docker 安装完成后,为了避免每次命…

软件测试的生命周期

目录 软件测试&软件开发生命周期 如何描述一个bug? 如何定义bug的级别 bug的生命周期 测试的执行和BUG管理 产生争执怎么办(处理人际关系) 软件测试&软件开发生命周期 需求阶段 --测试人员需要了解需求, 对需求进行分解得出测试需求 计…

hcip的重发布实验(1)

题目 拓扑图 IP地址配置 R1 < Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]sysname r1 [r1]int l0 [r1-LoopBack0]ip add 1.1.1.1 24 [r1-LoopBack0]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 Aug 8 2023 21:28:29-08:00 r1 %%0…

mysql的高级查询语句

目录 一、本文前言 二、高效查询方式 1&#xff09;指定指字段进行查看 2&#xff09;对字段进行去重查看 3&#xff09;where条件查询 4&#xff09;and 和 or 进行逻辑关系的增加 5&#xff09;查询取值列表中的数据 6&#xff09;between的引用 7&#xff09;like…

Windows实现开机自启软件

1.复制软件的快捷方式 2.winr 打开 运行 。输入 shell::startup &#xff0c;回车。 3.粘贴快捷方式

C/C++面试总结

一、关键字static、const、extern、volatile作用 1、const 1.修饰常量 用const修饰的变量是不可变的&#xff0c;修饰后的变量只能使用&#xff0c;不能修改。 2.修饰指针 如果const位于*的左侧&#xff0c;eg&#xff1a;const int* a&#xff0c;则const就是用来修饰指针…

C++三个线程依次打印abc

代码 #include<iostream> #include<thread> #include<mutex> #include<condition_variable> using namespace std; mutex mtx; condition_variable cv; int flag0; void A(){unique_lock<mutex>lk(mtx);int count0;while(count<10){while(fl…

系统集成项目成本管理

在项目中&#xff0c;成本是指项目活动或其组成部分的货币价值或价格&#xff0c;包括为实施、完成或创造该活动或其组成部分所需资源的货币价值。具体的成本一般包括直接工时、其他百接费用、间接工时、其他间接费用以及采购价格。 项目全过程所耗用的各种成本的总和为项目成本…

Linux安装配置nginx+php搭建以及在docker中配置

Linux安装配置nginxphp搭建以及在docker中配置 文章目录 Linux安装配置nginxphp搭建以及在docker中配置1.nginx源码包编译环境和安装相应的依赖1.1 安装编译环境1.2 安装pcre库、zlib库和openssl库 2.安装nginx2.1 在[nginx官网](https://nginx.org/en/download.html)上获取源码…