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

news2024/12/28 4:50:11

在这里插入图片描述

创建者模式

抽象工厂模式

概念

抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这是很多地方对于抽象工厂模式的描述,说实话感觉不是特别好懂。

按我的理解,用大白话讲,就是定义一套工厂的规范,按照这套规范可以创建很多的工厂,生产出不同的产品。

我们拿牛马人生公司为例。

假如苹果公司找到了牛马人生公司,跟牛马人生公司说,你帮我代加工生产手机和汽车等等一系列苹果公司的产品,但是要求生产苹果产品的工厂内必须只能生产苹果公司的产品。

牛马人生公司满口答应,多大点事对吧。

第二天,又有一个雪梨公司也找到了牛马人生公司,也要求代加工雪梨公司的产品,要求跟苹果公司一样。

牛马人生公司想了想也同意了。

牛马人生公司找到了工厂设计人员,总工程师想了想,苹果公司跟雪梨公司生产的产品都是一样的,何不设计一套工厂的规范,按照此工厂规范建造的工厂,就能满足苹果、雪梨这类的科技公司,后面还有什么西瓜公司、南瓜公司,也都可以按照这套规范来建造工厂。

于是乎,工厂创建规范出炉了,规范定义了,必须要有手机生产流水线、汽车组装流水线等等。

这一套定义工厂创建规范,并按照规范创建工厂,生产对应产品的思路就是抽象工厂模式。

实现步骤

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

  1. 首先我们定义了一个抽象类AbstractFactory,用来表示工厂的创建规范,如下面的代码所示,我们定义了这一类的工厂,必须要有生产手机和汽车的能力。规范里并没有告诉工厂要怎么生产产品,这些在具体的工厂中去完成。

    /**
     * 抽象工厂。
     * 抽象工厂里定义了这个工厂所能获取的所有产品(对象)。具体创建这些产品的行为在子类中实现。
     *
     * @author wanggt
     * @date 2023-06-17 11:19:21
     */
    public abstract class AbstractFactory {
    
        /**
         * 生产手机。
         *
         * @param model 型号
         *
         * @author wanggt
         * @date 2023-06-17 11:22:34
         */
        public abstract Phone producePhone(String model);
    
        /**
         * 生产汽车。
         *
         * @param color 颜色
         *
         * @author wanggt
         * @date 2023-06-17 11:26:02
         */
        public abstract Car produceCar(String color);
    }
    
  2. 我们的规范中除了定义了工厂的规范,还简单地定义了生产出来的产品有什么功能。例如,手机得可以打电话吧,汽车得能走吧。这些功能可能不同的公司实现的方式不同,比如有些汽车用油,有些汽车用电。规范里不管,我只说明,得有这个功能,才能叫做汽车。

    /**
     * 手机的接口定义。
     *
     * @author wanggt
     * @date 2023-06-17 11:26:37
     */
    public interface Phone {
    
        /**
         * 拨打电话。
         *
         * @author wanggt
         * @date 2023-06-17 11:27:28
         */
        void call(String targetNum);
    }
    
    /**
     * 汽车的接口定义。
     *
     * @author wanggt
     * @date 2023-06-17 11:27:45
     */
    public interface Car {
    
        /**
         * 往前冲。
         *
         * @author wanggt
         * @date 2023-06-17 11:28:28
         */
        void run();
    }
    
  3. 现在开始按照规范来打造工厂了。苹果工厂中手机流水线生产出来的手机是苹果手机ApplePhone,汽车流水线生产出来的是苹果汽车AppleCar

    /**
     * 苹果工厂。
     *
     * @author wanggt
     * @date 2023-06-17 11:29:43
     */
    public class AppleFactory extends AbstractFactory {
    
        @Override
        public Phone producePhone(String model) {
            return new ApplePhone(model);
        }
    
        @Override
        public Car produceCar(String color) {
            return new AppleCar(color);
        }
    }
    
    /**
     * 苹果手机
     *
     * @author wanggt
     * @date 2023-06-17 11:32:44
     */
    public class ApplePhone implements Phone {
    
        private final String model;
    
        public ApplePhone(String model) {
            this.model = model;
        }
    
        @Override
        public void call(String targetNum) {
            System.out.println("你好,我是苹果手机,型号 " + model + ",你是" + targetNum);
        }
    }
    
    /**
     * 苹果汽车
     *
     * @author wanggt
     * @date 2023-06-17 16:57:03
     */
    public class AppleCar implements Car {
        private final String color;
    
        public AppleCar(String color) {
            this.color = color;
        }
    
        @Override
        public void run() {
            System.out.println("我是苹果汽车,我百公里加速1秒");
        }
    }
    
  4. 按照规范打造了雪梨工厂,雪梨工厂中手机流水线生产出来的手机是雪梨手机PearPhone,汽车流水线生产出来的是雪梨汽车PearCar

    /**
     * 雪梨工厂。
     *
     * @author wanggt
     * @date 2023-06-17 11:30:21
     */
    public class PearFactory extends AbstractFactory {
    
        @Override
        public Phone producePhone(String model) {
            return new PearPhone(model);
        }
    
        @Override
        public Car produceCar(String color) {
            return new PearCar(color);
        }
    }
    
    public class PearPhone implements Phone {
        private final String model;
    
        public PearPhone(String model) {
            this.model = model;
        }
    
        @Override
        public void call(String targetNum) {
            System.out.println("你好,我是雪梨手机,型号 " + model + ",你是" + targetNum);
        }
    }
    
    public class PearCar implements Car {
        private final String color;
    
        public PearCar(String color) {
            this.color = color;
        }
    
        @Override
        public void run() {
            System.out.println("我是雪梨汽车,百公里加速100秒");
        }
    }
    
  5. 苹果公司看到雪梨公司也建了一个跟他一样的公司,这还得了,立马联系上了牛马人生公司的商务部门,要求多增加一套苹果工厂。牛马人生公司的商务部门向高层领导投诉,设计部门写的规范太难懂了,这不是他们商务部门要去研究的东西。这个时候,设计部门给商务部门提供了一套规则。如果是apple公司,就创建AppleFactory工厂,如果是pear公司,就创建PearFactory工厂。商务很满意,设计这么简单,这不是有手就行。

    public class FactoryProducer {
    
        /**
         * 获取工厂。
         *
         * @param company 公司
         *
         * @author wanggt
         * @date 2023-06-17 14:11:05
         */
        public static AbstractFactory getFactory(String company) {
            if ("apple".equalsIgnoreCase(company)) {
                return new AppleFactory();
            } else if ("pear".equalsIgnoreCase(company)) {
                return new PearFactory();
            } else {
                return null;
            }
        }
    }
    
  6. 工厂红红火火开工了,工厂建好之后,又试运行了下流水线,一台台手机,一辆辆汽车从工厂里生产出来,总设计师感到很满足。终于又为公司干了点实事,今年的裁员应该轮不到他了吧。

    public class AbstractFactoryPatternDemo {
        public static void main(String[] args) {
            // 创建一个苹果公司的工厂,并生产对应的产品
            AbstractFactory appleFactory = FactoryProducer.getFactory("apple");
            Phone phone = appleFactory.producePhone("11");
            phone.call("1234567890");
    
            Car appleCar = appleFactory.produceCar("白色");
            appleCar.run();
    
            System.out.println("====================");
    
            // 创建一个雪梨公司的工厂,并生产对应的产品
            AbstractFactory pearFactory = FactoryProducer.getFactory("pear");
            Phone pearPhone = pearFactory.producePhone("30");
            pearPhone.call("12343453464562");
    
            Car pearCar = pearFactory.produceCar("黄色");
            pearCar.run();
        }
    }
    
    你好,我是苹果手机,型号 11,你是1234567890
    我是苹果汽车,我百公里加速1秒
    ====================
    你好,我是雪梨手机,型号 30,你是12343453464562
    我是雪梨汽车,百公里加速100秒
    

优缺点分析

我们现在来分析下总工程师设计的这一套工厂创建规范。

优点就是按照这套工厂创建规范打造出来的工厂,生产出来的产品都是同一个产品族的,要么都是苹果公司的产品,要么都是雪梨公司的产品。进入苹果工厂,闭着眼睛也能知道,里面生产的全部苹果公司的产品。手机必定是苹果手机,而不可能是雪梨手机。

而且接下来如果有类似的公司找到牛马人生公司的时候,完全可以按照这套工厂创建规范,再创建一个西瓜工厂即可。

但是缺点也是有的。总工程师摸了摸下巴,没有告诉其他人这个缺点。

那就是假如以后苹果公司增加了一些产品,例如苹果飞机,那必然就要修改工厂创建规范。修改了工厂创建规范之后,还得去扩建苹果工厂,去增加这个流水线。

但是雪梨公司并不会生产飞机,那么这个时候,雪梨工厂里面出现了一点问题,雪梨工厂里面有为生产飞机的预留位置,实际上并不会生产飞机,这多少让雪梨公司的人不爽。因为那为生产飞机预留的位置,似乎一直在提醒他们,你雪梨公司就是比苹果公司差。

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

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

相关文章

ResNet-残差网络一

文章目录 残差网络深度网络退化残差结构残差网络对比测试plain net VS residual net不同的shrotcut connection残差网络增加层数 著名的残差网络主要是在两片论文里提出: Deep Residual Learning for Image RecognitionIdentity Mappings in Deep Residual Networks…

yolov8在rknn(rv1109/1126)模型转换、量化移植过程

续:rv1109/1126 rknn 模型量化过程_CodingInCV的博客-CSDN博客 Yolov8简介 yolov8是比较新的目标检测模型,根据论文和开源项目的报告,相对使用比较广泛的yolov5提升还比较明显。 yolov8与yolov5相比,结构上的主要区别是将C3结构…

hutool Sm2加解密-自定义公钥私钥

代码 首先说结论,hutool 的SM2对象的公钥私钥是不关联的,你可以存自己的私钥和别人的公钥,这样解密的时候只要协商好就能用了,以下是调换公钥私钥的加解密案例 公钥格式 04公钥x公钥y //使用自定义的公钥私钥生成sm2Testpubli…

android资深工程师如何分析system_server异常

Android系统中的System Server负责管理许多关键功能,例如进程管理、电源管理等。如果System Server出现异常,可能会导致系统重启或部份功能失效。作为Android资深工程师,分析System Server的异常状况时,考虑以下步骤:查…

晶澳转债上市价格预测

晶澳转债 基本信息 转债名称:晶澳转债,评级:AA,发行规模:89.603077亿元。 正股名称:晶澳科技,今日收盘价:31.71元,转股价格:38.78元。 当前转股价值 转债面值…

我做了一个JPA Specification的优化

目录 一、参考二、概述流程效果感受 三、实现原理AST树结构AstNode主要结构 把表达式解析成AstAst 解析成 JPA Specification 三、项目地址四、目前阶段的总结 一、参考 如何搞一个支持自定义函数和变量的四则运算的抽象语法树出来 二、概述 这是一个可以优化生成Specificati…

Android SystemServer中Service的创建和启动方式(基于Android13)

Android SystemServer创建和启动方式(基于Android13) SystemServer 简介 Android System Server是Android框架的核心组件,运行在system_server进程中,拥有system权限。它在Android系统中扮演重要角色,提供服务管理和通信。 system …

Pycharm中修改注释文本的颜色(详细设置步骤)

下面是在Pycharm中设置注释文本颜色的详细步骤: 下面是修改前后对比: 修改前注释行的颜色: 修改后注释行的颜色: 以上就是Pycharm中修改注释文本颜色的详细步骤,希望能帮到你!

pve安装dsm7.2,并启用照片同步

目录 1.文件准备 2. 创建虚拟机 3. 编译引导文件 4. 群晖安装 5. 安装Photos和mmfpeg 6. 安装手机APP 之前安装了pve版本的dsm6.2了,近期换硬盘,加上对dsm6.2的moments性能实在不满意,就产生尝鲜的想法,因为dsm7.0发布很久了…

2024年浙财MBA项目招生信息全面了解

2024年全国管理类硕士联考备考已经到了最火热的阶段,不少考生开始持续将注意力集中在备考的规划中!杭州达立易考教育整合浙江省内的MBA项目信息,为大家详细梳理了相关报考参考内容,方便大家更好完成择校以及针对性的备考工作。本期…

Day12-作业(SpringBootWeb登录认证)

作业1:完成课上所讲解的 登录 及 登录校验 的所有功能。[ 必须 ,至少敲两遍 - Filter] 作业2:调研第三方加密技术和落地方案,优化登录业务流程。 提示:推荐使用加盐加密的方式,对密码进行加密并校验 作业3…

【快应用】adbutton如何直接下载广告而不跳落地页再下载

【关键词】 原生广告、adbutton、下载 【问题背景】 快应用中的原生广告推出了adbutton组件来直接下载广告app,在使用的时候,点击adbutton按钮的安装文案,不是直接下载广告app,而是跳转到落地页后直接下载,这种情形该…

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理) em

​ 工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

cad中的曲线区域是如何绘制的

cad中的曲线区域是如何绘制的 最近需要把cad中的设备锁在区域绘画出来,不同设备放在不同区域 组合工具命令PLPE 步骤: 1.先用pl绘制,把设备都是绘制在pl的曲线范围内 2.用pe命令,选择pl的区域进行曲线(s&#xff…

基于SpringBoot+Vue的MOBA类游戏攻略分享平台设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

软考A计划-系统集成项目管理工程师-信息文档和配置管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

华为杯竞赛、高教社杯和数学建模国赛实现逆袭;评奖评优加分冲冲冲!

目录 ⭐ 赛事介绍 ⭐ 参赛好处 ⭐ 辅导比赛 ⭐ 赛事介绍 华为杯全国研究生数学建模竞赛是由华为公司主办的一项面向全国研究生的数学建模竞赛。该竞赛旨在通过实际问题的建模和解决,培养研究生的创新能力和团队合作精神,推动科技创新和应用。华为杯竞…

【超细节】Vue3的属性传递——Props

目录 前言 一、定义 二、使用 1. 在 setup 中(推荐) 2. 非 setup 中 3. 对象写法的校验类型 4. 使用ts进行类型约束 5. 使用ts时props的默认值 三、注意事项 1. Prop 名字格式 2. 对象或数组类型的默认值 3. Boolean 类型转换 前言 Vue3相较…

代码签名证书是什么?

代码签名证书是什么?有什么作用?代码签名证书是提供软件开发者可以进行代码软件数字签名的认证服务。通过对代码的数字签名可以消除软件在Windows系统被下载安装时弹出的“不明开发商”安全警告,保证代码完整性和不被恶意篡改,使软…

【严重】泛微 e-cology <10.58.3 任意文件上传漏洞

漏洞描述 泛微协同管理应用平台(e-cology)是一套企业大型协同管理平台。 泛微 e-cology 10.58.3之前版本存在任意文件上传漏洞,由于上传接口身份认证缺失,未经过身份验证的攻击者可以构造恶意请求将文件上传至服务器,攻击者可能通过上传jsp…