10.抽象工厂模式

news2024/11/18 8:42:16

江湖上再也没人找林家的麻烦了。因为林平之一怒之下将辟邪剑谱公诸天下。一下子印出去几万份,江湖上人人都能轻而易举的得到这本无尚武学;然而江湖人士却陷入深深的矛盾之中:
不练,别人练了,分分钟秒杀你;练了,不光要做出极大的牺牲,而且练完后也就那么回事,因为别人也练了。
——《笑傲江湖之内卷》

如果说简单工厂模式和工厂方法模式是《嵩山剑法》和《大嵩阳神掌》,那么抽象工厂模式就是被广而告之的《辟邪剑谱》。只不过,在掌握了前面两种工厂模式后,抽象工厂模式要容易理解的多。


一言

抽象工厂模式是简单工厂模式和工厂方法模式的整合。


概述

抽象工厂模式定义了一个interface用于创建相关或有依赖关系的对象族,而无需指明具体的类。它可以将简单工厂模式和工厂方法模式进行整合。

从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇更利于代码的维护和扩展。


更进一步

作为一个95后,笔者依稀记得初中时候在学校旁有一家很好吃的面馆,店面不大却很是整洁,在那个没有自媒体和云支付的时代依然是生意火爆。自然的,在我上高中的时候,这家店就开了大量的连锁店,虽然名声还在可是分店的味道却渐渐不如人意。慢慢的,传来了面馆经营不善的消息,我还在当时的报纸上看到了老板的求贤广告。

我觉得这其实是很多加盟类餐饮要面临的最大挑战之一,挺住了就是做大做强,挺不住可能就是血本无归。这个问题就是,在分店不断扩张的情况下,如何保持品牌原本的竞争力是可复制的。

其实,工厂方法模式和抽象工厂模式就很好的阐明了这一点。在最初接触两种模式很容易混淆,不理解工厂方法模式和抽象工厂模式的区别,如果用我的话简单来说,工厂方法模式就像一个小老板,它将自己优秀的方法抽象出来,允许子类继承和实现,但是主体基本还是掌控在自己手里。所以,这个小老板会有为数不多的分店(子类),但势必不会将事业做的很大。
而抽象工厂模式则是一个一心想打通整个产业链的企业家,它不拘泥于优势方法的具体实现,它只想要扩展性最高的实现方案。


案例

我还是延续上一次的案例,wayne 继续着造车梦,这一次我们在北京、伦敦都开设了造车工厂,使得我不得不将部分的自主权利下放的各个工厂。
抽象工厂

public interface AbsFactory {
    public Car createCar(String orderType);
}

北京工厂

public class BjFactory implements AbsFactory{
    @Override
    public Car createCar(String orderType) {
        Car car =null;
        if (orderType.equals("oil")){
            car = new OilCar();
            car.setName("北京产 wayne 系列混合动力轿车");
        }else if (orderType.equals("ele")){
            car = new EleCar();
            car.setName("北京产 wayne 系列电车  ");
        }
        return car;
    }
}

伦敦工厂

public class LDFactory implements AbsFactory{
    @Override
    public Car createCar(String orderType) {
        Car car =null;
        if (orderType.equals("oil")){
            car = new OilCar();
            car.setName("伦敦产 wayne 系列混合动力轿车");
        }else if (orderType.equals("ele")){
            car = new EleCar();
            car.setName("伦敦产 wayne 系列电车  ");
        }
        return car;
    }
}

订单

public class OrderCar {
    AbsFactory factory;
    //构造器
    public OrderCar(AbsFactory factory){
        setAbsFactory(factory);
    }
    //set工厂
    private void setAbsFactory(AbsFactory factory){
        System.out.println("使用的是抽象工厂模式");
        Car car = null;
        String orderType="";
        this.factory = factory;
        do {
            orderType = getType();
            car = factory.createCar(orderType);//factory可能是北京的工厂也可能是伦敦的工厂
            if (car!=null){
                car.prepare();
                car.process();
                car.assemble();
                car.check();
            }else {
                System.out.println("订购失败");
                break;
            }
        }while (true);
    }
    private String getType(){
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input car type");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }
}

分析

可以看到结构上和工厂方法模式非常像,对于二者的区别我们可以再根据chatGPT的回答深入理解下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也就是说抽象方法模式更像是为更广泛的产品体系准备的一种工厂模式。它使得整个体系更加松散和灵活实现了高度解耦的结构。


关注我,共同进步,每周至少一更。——Wayne

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

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

相关文章

Qt QSlider滑动条控件

文章目录 1 属性和方法1.1 值1.2 方向1.3 步长1.4 信号和槽 2 实例2.1 布局2.2 代码实现 QSlider是滑动条控件,滑动条可以在一个范围内拖动,并将其位置转换为整数 最常见的应用就是视频播放器中的进度条 1 属性和方法 QSlider继承自QAbstractSlider&…

<软考高项备考>《论文专题 - 66 质量管理(5) 》

4 收尾 4.1 收尾-经验教训 经验: 1、制订科学合理的质量管理,管理质量,质量控制计划很重要。 2、严格执行质量管理,管理质量和质量控制计划很重要。 3、质量管理的工具和技术不宜采用过多,适用和够用就好&#xff0c…

Simulink|电力系统风储联合一次调频仿真模型

主要内容 风电高渗透率下,电力系统对风电场频率调节能力提出了技术要求。考虑风机惯性控制和变桨距控制的频率响应能力,提出将储能与风电自身调频手段相结合,参与系统频率调节。模型采用Simulink进行仿真,建立了风储联合调频下…

Spring Cloud整体架构解析

Spring Cloud整体架构 本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。 Spring Cloud的中文名我们就…

Tiktok/抖音旋转验证码识别

一、引言 在数字世界的飞速发展中,安全防护成为了一个不容忽视的课题。Tiktok/抖音,作为全球最大的短视频平台之一,每天都有数以亿计的用户活跃在其平台上。为了保护用户的账号安全,Tiktok/抖音引入了一种名为“旋转验证码”的安…

《Git学习笔记:IDEA整合Git》

在IDEA中集成Git去使用 通过Git命令可以完成Git相关操作,为了简化操作过程,我们可以在IDEA中配置Git,配置好后就可以在IDEA中通过图形化的方式来操作Git。 在IDEA开发工具中可以集成Git: 集成后在IDEA中可以看到Git相关图标&…

WeNet2.0:提高端到端ASR的生产力

摘要 最近,我们提供了 WeNet [1],这是一个面向生产(工业生产环境需求)的端到端语音识别工具包,在单个模型中,它引入了统一的两次two-pass (U2) 框架和内置运行时(built-in runtime)…

WPF 布局

了解 WPF中所有布局如下,我们一一尝试实现,本文档主要以图形化的形式展示每个布局的功能。 布局: Border、 BulletDecorator、 Canvas、 DockPanel、 Expander、 Grid、 GridView、 GridSplitter、 GroupBox、 Panel、 ResizeGrip、 Separat…

怎样制作一本旅游电子相册呢?

​随着数码技术的发展,旅游电子相册已成为越来越多旅游爱好者的必备工具。它不仅能让您随时随地欣赏自己的旅行回忆,还能分享给亲朋好友,甚至上传到社交媒体上,让更多人了解您的旅行故事。那么,如何制作一本精美的旅游…

HarmonyOS4.0系列——05、状态管理之@Prop、@Link、@Provide、@Consume,以及@Watch装饰器

状态管理 看下面这张图 Components部分的装饰器为组件级别的状态管理,Application部分为应用的状态管理。开发者可以通过StorageLink/LocalStorageLink 实现应用和组件状态的双向同步,通过StorageProp/LocalStorageProp 实现应用和组件状态的单向同步。…

智能路由器中的 dns.he.net可使用自定义域名的免费 DDNS 服务配置方法

今天介绍的这个是可以使用自定义域名同时支持使用二级域名的免费DDNS服务 dns.he.net的动态DDNS服务的配置方法, 这个服务相对还是比较稳定的, 其配置也和其他的DDNS服务有些不太一样, 首先他的主机名: 这里需要设置为登录后分配的区域域名: ipv6.he.net 然后就是 DDNS 用户…

cad二次开发autolisp(一)

文章目录 一、概述1.1 简介1.2 打开编辑器1.3 调试页面 二、数据类型三、函数3.1 用户函数 四、语句4.1 常规语句4.2 流程控制语句 五、图元操作5.1 定义5.2 图元选择5.3 图元属性列表 一、概述 1.1 简介 简介:cad 二次开发语言,后缀名*.lsp适用于编写…

tda7294引脚功能和电压_三款tda7294应用电路

tda7294引脚功能 1脚为待机端; 2脚为反相输入端; 3脚为正相输入端; 4脚接地; 5、11、12脚为空脚; 6脚为自举端; 7脚为Vs(信号处理部分); 8脚为-Vs(信号…

分布式计算平台 Hadoop 简介

Hadoop简介 Hadoop是一种分析和处理大数据的软件平台,是一个用Java语言实现的Apache的开源软件框架,在大量计算机组成的集群中实现了对海量数据的分布式计算。其主要采用MapReduce分布式计算框架,包括根据GFS原理开发的分布式文件系统HDFS、…

解锁 JavaScript 数组的强大功能:常用方法和属性详解(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

使用Qt连接scrcpy-server控制手机

Qt连接scrcpy-server 测试环境如何启动scrcpy-server1. 连接设备2. 推送scrcpy-server到手机上3. 建立Adb隧道连接4. 启动服务5. 关闭服务 使用QTcpServer与scrcpy-server建立连接建立连接并视频推流完整流程1. 开启视频推流过程2. 关闭视频推流过程 视频流的解码1. 数据包协议…

C++进阶--AVL树

AVL树 一、AVL树的概念二、AVL树节点的定义三、AVL树的插入四、AVL树的旋转4.1 左单旋4.2 右单旋4.3 左右双旋4.4 右左双旋 五、AVL树的验证六、AVL树的删除七、AVL树的性能七、完整代码7.1 AVLTree.h 一、AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有…

命令行登录Mysql的详细讲解

目录 前言1. 本地登录2. 远程登录3. 拓展 前言 对于命令行登录Mysql一般都是用mysql -u root -p 但对于如何远程登陆,一直其他的参数还是有些盲区,对此总结科普 对于登录过程中出现的问题,可看我之前的文章: 服务器 出现ERROR …

CTF伪随机数爆破

要了解伪随机数的爆破首先你的先知道什么是PHP种子, 借用在rand()函数中,我们可以通过设置随机数种子来影响随机数的生成。例如,在rand()函数中加入了随机数种子编码后,每次运行程序将会生成同样的随机整数序列。这个就是伪随机数…

Python实现对角但非同一性协方差结构回归模型(WLS算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 WLS回归分析是一种常用的回归分析方法,通过对数据进行加权处理,可以更准确地评…