当前位置: 首页 > news >正文

设计模式三:抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定具体实现类。
在软件开发中,有时候需要根据不同的条件或环境来创建一组相关的对象。抽象工厂模式将对象的创建逻辑封装在一个抽象工厂接口中,该接口声明了一系列用于创建不同类型对象的方法。具体的工厂类实现了这个接口,每个具体工厂类负责创建一组相关的对象。

通过使用抽象工厂模式,我们可以达到以下几个目标:

将客户端代码与具体产品的实现细节解耦,客户端只需要知道抽象工厂以及抽象产品的接口,而不需要关心具体的实现类。
提供一种扩展机制,当需要增加新的产品族时,只需要添加新的具体工厂类和具体产品类即可,而不需要修改已有的代码。
保持创建一组相关对象的一致性,确保所有创建出的对象都是相互匹配并且可以协同工作的。

抽象工厂模式适用于以下场景:

当需要创建一组相关的产品对象,并且这些产品对象之间有一定的约束关系时,可以使用抽象工厂模式。该模式保证了创建出来的产品对象是相互匹配并且可以协同工作的。
当系统需要独立于其产品的创建、组合和表示时,可以使用抽象工厂模式。通过使用抽象工厂模式,可以将产品的实现细节与客户端代码分离开来,使得客户端代码更加灵活和可维护。
当希望通过切换具体工厂类来改变整个产品族的构成时,可以使用抽象工厂模式。抽象工厂模式可以将产品的创建从客户端代码中解耦出来,使得系统更易于扩展和演化。
当需要指定创建对象的具体工厂时,可以使用抽象工厂模式。通过向抽象工厂提供一个参数,即可得到相应的具体工厂,然后通过具体工厂来创建所需的产品对象。

抽象工厂的具体实践

抽象工厂模式是一种创建型设计模式,它通过定义一个接口或抽象类作为工厂的基础,并在该接口或抽象类中声明用于创建不同类型产品对象的方法。具体的工厂类实现这个接口或抽象类,并按照特定规则实现产品对象的创建逻辑。
下面是一个简单的抽象工厂模式的代码示例:

// 抽象产品A
interface ProductA {void operation();
}// 具体产品A1
class ConcreteProductA1 implements ProductA {@Overridepublic void operation() {System.out.println("Concrete Product A1");}
}// 具体产品A2
class ConcreteProductA2 implements ProductA {@Overridepublic void operation() {System.out.println("Concrete Product A2");}
}// 抽象产品B
interface ProductB {void operation();
}// 具体产品B1
class ConcreteProductB1 implements ProductB {@Overridepublic void operation() {System.out.println("Concrete Product B1");}
}// 具体产品B2
class ConcreteProductB2 implements ProductB {@Overridepublic void operation() {System.out.println("Concrete Product B2");}
}// 抽象工厂
interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}// 具体工厂1,负责创建具体产品系列1
class ConcreteFactory1 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA1();}@Overridepublic ProductB createProductB() {return new ConcreteProductB1();}
}// 具体工厂2,负责创建具体产品系列2
class ConcreteFactory2 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA2();}@Overridepublic ProductB createProductB() {return new ConcreteProductB2();}
}// 客户端通过抽象工厂接口使用产品
public class Client {private ProductA productA;private ProductB productB;public Client(AbstractFactory factory) {this.productA = factory.createProductA();this.productB = factory.createProductB();}public void operation() {productA.operation();productB.operation();}public static void main(String[] args) {AbstractFactory factory1 = new ConcreteFactory1();Client client1 = new Client(factory1);client1.operation();AbstractFactory factory2 = new ConcreteFactory2();Client client2 = new Client(factory2);client2.operation();}
}

以上示例中,我们定义了两个产品族(ProductA和ProductB),每个产品族都有两个具体产品。抽象工厂(AbstractFactory)定义了创建产品的接口,具体工厂(ConcreteFactory1和ConcreteFactory2)实现了抽象工厂接口,并根据具体需求分别创建了不同的产品组合。
在客户端(Client)代码中,我们选择了要使用的具体工厂,然后通过该工厂创建产品并进行操作。

抽象工厂模式的优缺点

提供了一种易于扩展的方式来创建一组相关或依赖的对象。通过添加新的具体工厂和产品类,可以很容易地扩展抽象工厂模式。
客户端代码与具体类解耦。由于客户端只依赖于抽象类型,因此可以轻松地切换不同的工厂实现,从而改变创建的对象家族。
可以确保创建的产品是相互匹配的。由于抽象工厂负责创建一组相关的对象,因此可以保证这些对象之间的兼容性和一致性。
缺点:
增加了系统的复杂性。引入抽象工厂模式会增加额外的抽象层次,可能会导致系统更难理解和维护。
难以支持新种类的产品。当需要支持新的产品家族时,需要修改抽象工厂的接口以及所有具体工厂的实现,这可能会对现有代码产生一定的影响。
不利于单一职责原则。抽象工厂模式的具体工厂通常会负责创建一组相关或依赖的产品,这可能违反了单一职责原则。
综上所述,抽象工厂模式在某些情况下是有用的,特别是当需要创建一组相关对象时。但是,在使用抽象工厂模式之前,需要权衡其优点和缺点,并考虑是否适合特定的应用场景。

相关文章:

设计模式三:抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定具体实现类。 在软件开发中,有时候需要根据不同的条件或环境来创建一组相关的对象。抽象工…...

Linux用户权限问题详解

Linux用户权限问题详解 【一】Linux权限的概念(1)用户类型(2)如何切换用户(3)用户相关的一些命令 【二】Linux文件权限管理(1)文件访问者的分类(2)文件类型和…...

flask中的session介绍

flask中的session介绍 在Flask中,session是一个用于存储特定用户会话数据的字典对象。它在不同请求之间保存数据。它通过在客户端设置一个签名的cookie,将所有的会话数据存储在客户端。以下是如何在Flask应用中使用session的基本步骤: 首先…...

记录联想拯救者R720重装系统

文章目录 bios里找不到U盘启动项2023.7.23重装系统后数据记录C盘内存修改默认AppData的路径(亲测,没用) bios里找不到U盘启动项 制作好启动盘后,开机按F2进入bios后,找不到U盘启动项,如下图所示&#xff1…...

Spring Alibaba Sentinel实现集群限流demo

1.背景 1.什么是单机限流? 小伙伴们或许遇到过下图这样的限流配置 又或者是这样的Nacos动态配置限流规则: 以上这些是什么限流?没错,就是单机限流,那么单机限流有什么弊端呢? 假设我们集群部署3台机器&a…...

102、SOA、分布式、微服务之间有什么关系和区别?

SOA、分布式、微服务之间有什么关系和区别? 分布式架构是指将单体架构中的各个部分拆分,然后部署到不同的机器或进程中去,SOA和微服务基本上都是分布式架构师SOA是一种面向服务的架构,系统的所有服务都注册在总线上,当调用服务时…...

Ubuntu 20.04下的录屏与视频剪辑软件

ubuntu20.04下的录屏与视频剪辑 一、录屏软件SimpleScreenRecorder安装与使用 1、安装 2、设置录制窗口参数 3、开始录制 二、视频剪辑软件kdenlive的安装 1、安装 2、启动 一、录屏软件SimpleScreenRecorder安装与使用 1、安装 (1)直接在终端输入以下命…...

面试题 -- iOS数据存储

文章目录 一、如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢?二、SQLite 数据存储是怎么用?三、简单描述下客户端的缓存机制?四、实现过多线程的Core Data 么?NSPersistentStoreCoordinator&#xff0…...

spring复习:(51)environment、systemProperties、systemEnvironment三个bean是在哪里被添加到容器的?

一、主类: package cn.edu.tju.study.service.anno;import cn.edu.tju.study.service.anno.config.MyConfig; import cn.edu.tju.study.service.anno.domain.Person; import com.sun.javafx.runtime.SystemProperties; import org.springframework.context.annotat…...

element ui 上传控件携带参数到后端

1.携带固定参数&#xff1a; 2.携带不固定参数&#xff1a; <el-row> <el-col :span"24"> <el-upload :multiple"false" :show-file-list"false" :on-success"f_h…...

scrapy分布式+指纹去重原理

1&#xff0c;指纹去重原理存在于 scrapy.util.requests 里面 需要安装的包 pip install scrapy-redis-cluster # 安装模块 pip install scrapy-redis-cluster0.4 # 安装模块时指定版本 pip install --upgrade scrapy-redis-cluster # 升级模块版本 2&#xff0c;setting配置 …...

FileHub使用教程:Github Token获取步骤,使用快人一步

FileHub介绍 filehub是我开发的一个免费文件存储软件&#xff0c;可存万物。软件仓库&#xff1a;GitHub - Sjj1024/s-hub: 一个使用github作为资源存储的软件 软件下载地址&#xff1a;。有问题可以留言或者提Issue&#xff0c; 使用第一步&#xff1a;获取Github Token 使…...

嵌入式开发:单片机嵌入式Linux学习路径

SOC&#xff08;System on a Chip&#xff09;的本质区别在于架构和功能。低端SOC如基于Cortex-M架构的芯片&#xff0c;如STM32和NXP LPC1xxx系列&#xff0c;不具备MMU&#xff08;Memory Management Unit&#xff09;&#xff0c;适用于轻量级实时操作系统如uCOS和FreeRTOS。…...

Libvirt的virsh工具常用命令

在使用Libvirt的virsh工具时&#xff0c;以下是常见的一些命令&#xff1a; 连接到Hypervisor&#xff1a; virsh -c <URI>&#xff1a;连接到指定的Hypervisor&#xff0c;例如 virsh -c qemu:///system 连接到本地的QEMU/KVM Hypervisor。 虚拟机管理&#xff1a; list…...

高斯消元解异或方程组写法

高斯约旦消元解异或方程组 for(int j1;j<n;j){for(int ij1;i<n;i)if(a[i][j]){swap(a[i],a[j]);break;}if(!a[i][i]){if(a[i][n1])//no...else ...//mul}for(int i1;i<n;i)if(i!j&&a[i][j])for(int kj;k<n1;k)a[i][k]^a[j][k];}正常高斯消元法 int r1;for…...

前端 mock 数据的几种方式

目录 接口demo Better-mock just mock koa webpack Charles 总结 具体需求开发前&#xff0c;后端往往只提供接口文档&#xff0c;对于前端&#xff0c;最简单的方式就是把想要的数据写死在代码里进行开发&#xff0c;但这样的坏处就是和后端联调前还需要再把写死的数据…...

【GO】go语言入门实战 —— 猜数字游戏

文章目录 程序介绍设置随机数读取用户输入实现判断逻辑实现游戏循环完整代码 程序介绍 首先生成一个介于1~100之间的随机数&#xff0c;然后提示玩家输入数字&#xff0c;并告诉玩家是猜对了还是猜错了&#xff0c;如果对了程序就结束&#xff0c;如果错了就提醒玩家是大了还是…...

opencv-25 图像几何变换04- 透视 cv2.warpPerspective()

什么是透视&#xff1f; 透视是一种几何学概念&#xff0c;用于描述在三维空间中观察物体时&#xff0c;由于视角的不同而产生的变形效果。在现实世界中&#xff0c;当我们从不同的角度或位置观察物体时&#xff0c;它们会呈现出不同的形状和大小。这种现象被称为透视效果。 透…...

视频讲解Codeforces Round 887 (Div. 2)(A--C)

文章目录 A. Desorting1、板书2、代码 B. Fibonaccharsis1、板书2、代码 C. Ntarsis Set1、板书2、代码 视频讲解Codeforces Round 887 (Div. 2)&#xff08;A–C&#xff09; A. Desorting 1、板书 2、代码 #include<bits/stdc.h> #define endl \n #define INF 0x3f…...

【团队协作开发】将Gitee项目导入到本地IDEA中出现根目录不完整的问题解决(已解决)

前言&#xff1a;在团队协作开发过程中&#xff0c;通常我们的Gitee完整项目中会包含很多内容&#xff1a;后端代码、前端代码、项目结构图、项目文档等一系列资产。 将Gitee项目导入到本地IDEA中&#xff0c;通常会出现根目录不完整的问题。这是因为项目里面包含了后端代码、前…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...