05.抽象工厂模式

news2025/2/25 5:35:11

05.抽象工厂模式

概念

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。抽象工厂又称为Kit模式,属于对象创建型模式。

抽象工厂可以将统一产品族的单独工厂封装起来,在正常使用中,客户端需要创建抽象工厂的实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。

用途

抽象工厂模式和工厂模式一样,都符合开放-封闭原则。但是不同的是,工厂模式是在新增一个具体的产品时,会增加对应的工厂。但抽象工厂模式只有在新增一个类型的具体产品时才需要新增工厂。也就是说,工厂模式的一个工厂只能创建一个产品,而抽象工厂模式的一个工厂是创建一类产品

场景:

  • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
  • 系统中有多于一个的产品族,而每次只使用其中某一产品族。
  • 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
  • 系统提供一个产品类的库,所有的产品以同样的接口出现,从而是客户端不依赖于具体实现。

实现方式:

抽象工厂模式包含如下角色:

  • 抽象工厂(AbstractFactory):用于声明生成抽象产品的方法。
  • 具体工厂(ConcreteFactory):实现抽象工厂声明的生成抽象产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
  • 抽象产品(AbstractProduct):为每种产品声明接口,在抽象产品中定义了产品的抽象业务方法。
  • 具体产品(Product):定义具体工厂生成的具体类型对象,实现抽象产品接口中定义的业务方法。

举例

假如我们是一家汽车代工厂,我们负责奔驰和特斯拉两家公司制造车子。我们可以认为奔驰是加油的车子,特斯拉是充电的车子。其中奔驰和特斯拉都有跑车和商务车两种类型。

65E870BC-1765-4BFC-83A3-00C25A6D9FDC_1_105_c

以上场景,我们就可以把跑车和商务车分别对峙,对于跑车有单独的工厂创建,商务车也有单独的工厂。这样,以后无论再帮哪家厂商造车,只要是跑车或者商务车我们就不需要再引入工厂。同样,如果要增加一种类型的车,比如越野车,我们也不需要对跑车或者商务车做任何东西的修改。

(1)抽象产品: 奔驰车和特斯拉

/**
 * 奔驰接口 - 抽象产品
 */
public interface BenzCar {
    /**
     * 加油车
     */
    public void gasUp();
}

/**
 * 特斯拉 - 抽象产品
 */
public interface TeslaCar {
    /**
     * 充电
     */
    public void charge();
}

(2)具体产品:奔驰商务车、奔驰跑车、特斯拉商务车、特斯拉跑车

/**
 * 奔驰商务车 - 具体产品
 */
public class BenzBusinessCar implements BenzCar {
    @Override
    public void gasUp() {
        System.out.println("奔驰商务车加油");
    }
}

/**
 * 奔驰跑车 - 具体产品
 */
public class BenzSportCar implements BenzCar {
    @Override
    public void gasUp() {
        System.out.println("给奔驰跑车加油");
    }
}


/**
 * 特斯拉商务车 - 具体产品
 */
public class TeslaBusinessCar implements TeslaCar {
    @Override
    public void charge() {
        System.out.println("特斯拉商务车加电");
    }
}

/**
 * 特斯拉电动车 - 具体产品
 */
public class TeslaSportCar implements TeslaCar {

    @Override
    public void charge() {
        System.out.println("特斯拉跑车充电");
    }
}

(3)抽象工厂:汽车工厂

/**
 * 汽车 - 抽象工厂
 */
public interface CarFactory {
    public BenzCar getBenzCar();
    public TeslaCar getTeslaCar();
}

(4)具体工厂:商务车工厂、跑车工厂

/**
 * 商务车工厂 - 具体工厂
 * @author <a href="zhang_gengying@dahuatech.com">zhang_gengying</a>
 * @Date: 2022/2/21
 * @Since 1.1.1
 */

public class BusinessCarFactory implements CarFactory {
    @Override
    public BenzCar getBenzCar() {
        return new BenzBusinessCar();
    }

    @Override
    public TeslaCar getTeslaCar() {
        return new TeslaBusinessCar();
    }
}

/**
 * 跑车工厂 - 具体工厂1
 */

public class SportCarFactory implements CarFactory {
    @Override
    public BenzCar getBenzCar() {
        return new BenzSportCar();
    }

    @Override
    public TeslaCar getTeslaCar() {
        return new TeslaSportCar();
    }
}

开闭原则的倾斜性

“开闭原则” 要求系统对扩展开放,对修改关闭,通过扩展达到增强的目的。对于涉及到多个产品族与多个产品等级结构的系统,其功能增强包括两方面:

增加产品族:对于增加新的产品族,工厂方法模式很好的支持了"开闭原则",对于新增加的产品族,只需要对应增加一个新的具体工厂即可,对已有代码无须做任何修改。

增加新的产品等级结构:对于增加新的产品等级结构,需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品的方法,不能很好地支持"开闭原则"。

抽象工厂模式的这种性质称为"开闭原则"的倾斜性,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,但不能为新的产品等级结构的增加提供这样的方便。

抽象工厂模式、工厂方法模式、简单工厂之间的关系

当抽象工厂模式中每一个具体工厂类只能创建一个产品对象,也就是只存在一个产品等级结构时,抽象工厂模式退化成工厂方法模式。

抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。

当抽象工厂模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品,并将创建对象的工厂方法设计为静态方法时,抽象工厂模式就退化成简单工厂模式。

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

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

相关文章

08.适配器模式

08.适配器模式 概念&#xff1a; 将一个类的接口转化成用户需要的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式可以分为类适配器和对象适配器两种&#xff0c;区别在于适配器角色对应被适配角色的适配是通过继承还是组合…

单月涨粉30w+,他们掌握引流法宝,小红书1月创作趋势是什么?

新年来到&#xff0c;在刚过去的1月&#xff0c;小红书平台涌现出哪些黑马博主&#xff1f;品牌在投放种草方面有何亮眼表现&#xff1f;为洞察小红书平台的内容创作趋势及品牌营销策略&#xff0c;新红推出1月月度榜单&#xff0c;从创作者及品牌两方面入手&#xff0c;解析月…

计算机网络-I/O多路复用机制

I/O多路复用机制 I/O多路复用&#xff08;multiplexing&#xff09;的本质是通过一种机制&#xff08;系统内核缓冲I/O数据&#xff09;&#xff0c;让单个进程可以监视多个文件描述符&#xff08;File descriptor是计算机科学中的一个术语&#xff0c;是一个用于表述指向文件的…

2.11 PID控制算法(四)补充

文章目录 1、理论1、代码3、分析3.1 比例项:3.2 比例+积分3.3 比例+积分+微分1、理论 1、代码 typedef struct {s32 Uplimit; //输出限幅s32 Downlimit; //输出限幅s32 target; // 目标输出量s3

leveldb源码解析二——SSTable

本章解析leveldb的基本组件——SSTable&#xff0c;SSTable一旦形成&#xff0c;就不会被改变&#xff0c;SSTable的操作有以下2种&#xff1a; 1、构建SSTable&#xff0c;在minor compaction和major compaction时&#xff0c;会构建SSTable&#xff0c;其中minor compaction是…

Opencv DNN C++ CPU 平台编译配置过程

Opencv DNN C CPU 平台编译配置过程 以下内容基于 windows 平台&#xff0c;实际上不同平台在基础工具齐全的情况下&#xff0c;编译过程差异并不大。 opencv 随着版本的更新&#xff0c;对于不同算子的支持也会逐步完善&#xff0c;所以尽量使用新的版本。 同时也可以把对应…

TCP滑动窗口协议与流量控制

谈到TCP的滑动窗口协议与流量控制&#xff0c;便会想起2006年去华为-3COM&#xff08;现H3C公司时&#xff09;面试时的场景。 当年毕业后&#xff0c;刚刚学了一点TCP的皮毛&#xff0c;仅仅是知道了TCP是面向连接的协议&#xff0c;以对每个报文都进行确认超时重传的机制来保…

摸鱼时间,画个吃豆人玩一下

Ⅰ . 吃豆人小游戏 Canvas API&#xff08;画布&#xff09;是在 HTML5 中新增的标签用于在网页实时生成图像&#xff1b;是一个非常适合&#xff0c;做一些有趣的小游戏 和 动画&#xff1b;下面我们来简单的写一下 这个小例子 &#x1f447; 文章目录Ⅰ . 吃豆人小游戏Ⅱ. 实…

学习嵌入式必读十本书,从C语言到ARM

学习嵌入式必读的十本书籍&#xff0c;按照C语言、数据结构、Linux、C、QT、单片机、ARM的顺序给大家推荐。 01 C语言 凡是计算机、电子、通信、自动化、机械专业的同学&#xff0c;大一的时候必学C语言&#xff0c;而且大部分高校选择的教材都是谭浩强。这本书在网上的评价褒…

【计算机程序设计思想与方法】2 什么是计算思维?

1.2 什么是计算思维? 如《【计算机程序设计思想与方法】1 什么是计算?》中所述,计算是利用计算机一步一步地执行指令来解决问题的过程,计算机科学是关于计算的科学。 正如数学家在证明数学定理时,有独特的数学思维。工程师在设计制造产品时,有独特的工程思维。艺术家在…

【验证码逆向专栏】某验“初代”滑块验证码逆向分析

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 本文章未经许可禁止转载…

【算法】递归

目录1.递归概述2.何时使用递归2.1.定义是递归的2.2.数据结构是递归的2.3.问题的求解方法是递归的3.递归模型4.应用本文参考&#xff1a; 《数据结构教程》第 5 版 李春葆 主编 1.递归概述 &#xff08;1&#xff09;在定义一个过程或函数时&#xff0c;出现直接或者间接调用自…

【微服务】Elasticsearch文档索引库操作(二)

&#x1f697;Es学习第二站~ &#x1f6a9;Es学习起始站&#xff1a;【微服务】Elasticsearch概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;微服务探索之旅 &#x1f44d;希望您能有所收获 一.索引库操作 索引库就类似数据库表&#xff0c;mapping映射就类…

DGIOT低代码场景部门的搭建过程

[小 迪 导读] : 通过低代码页面与konva 大屏的页面设计,围绕部门&#xff0c;实现应用场景快速搭建1.部门创建以及权限分配1.1 打开部门管理页面1.2新增部门1.3 权限分配&#xff0c;点击刚创建的部门&#xff0c;在菜单分配中选择总控台和设备管理(低代码平台会过滤掉非低代码…

Wandb:make visualization better than Tensorboard

Wandb&#xff1a;make visualization better than Tensorboard wandb :一个在线的可多人协作的多功能可视化工具包 我最开始使用的tensorboard&#xff0c;还写了一些相关tensorboard的脚本用于实验。tensorboard这里就不详细介绍了&#xff0c;相信大家都比较了解。直到尝试了…

【MySQL数据库入门】:表的约束

表的约束 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务 逻辑角度保证数据的正确性。比如有一个字段是email&#xff0c;要求是唯一的。 表的约束很多&#xff0c;这里主…

版本管理之Git

一.版本控制器的方式1.1集中式版本控制工具集中式版本控制工具&#xff0c;版本库是集中存放在中央服务器的&#xff0c;team里每个人work时从中央服务器下载代 码&#xff0c;是必须联网才能工作&#xff0c;局域网或互联网。个人修改后然后提交到中央版本库。 举例&#xff1…

巧用回调函数解决微信小程序与后台数据交互出现的异步问题

问题描述 微信小程序端需要发送一个包含文字与图片的表单数据给后端&#xff0c;我一开始的思路是先上传图片得到临时的URL&#xff0c;后执行POST请求将表单数据发送给后端&#xff0c;但后端只能获取到文字&#xff0c;而图片URL却始终获取不到。 问题原因 注意看我上面的思路…

目标检测研究

传统的目标检测流水线 1.候选区域生成 通过滑动窗口选择感兴趣区域Rol;使用多尺寸的输入图像和多尺度的滑动窗口识别多尺度和不同比例的目标。 ⒉特征向量抽取 常用SIFT、 Harr、HOG、SURF。 3.区域分类 常用支持向量机。 结合集成、串联学习、梯度…

3D俯视角色割草游戏模板+视频教程,免费发布 | 一周精品推荐

大家好&#xff0c;我是晓衡。新年开工第一周&#xff0c;我就被热心的开发者们感动得热泪盈眶&#xff01;今天我冒死推荐几款 Creator 游戏开发资源&#xff0c;希望能对得起这些开发者们&#xff0c;同时也希望你能也有所收获。3D俯视角割草游戏视频源码B 站 UP 主『好巧啊c…