【设计模式】创建型-抽象工厂模式

前言

在软件开发领域,设计模式是一种被广泛接受的解决方案,用于解决特定问题并提供可维护和可扩展的代码结构。抽象工厂模式(Abstract Factory Pattern)是其中之一,它提供了一种方法来创建一系列相关或相互依赖的对象,而无需指定其具体类。

一、什么是抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定其具体实现类。抽象工厂模式通过引入抽象工厂接口和一组抽象产品接口,允许客户端使用抽象接口来创建一系列相关的产品对象,从而使得产品的创建过程与客户端解耦。

二、抽象工厂模式的核心组成部分

抽象工厂模式通常涉及以下几个角色:

  1. 抽象工厂(Abstract Factory): 定义了一个创建一系列产品的接口,每个方法用于创建一个具体产品的对象。
  2. 具体工厂(Concrete Factory): 实现了抽象工厂接口,负责创建具体的产品对象。
  3. 抽象产品(Abstract Product): 定义了产品的接口,描述了产品的特性。
  4. 具体产品(Concrete Product): 实现了抽象产品接口,具体描述了产品的特性。

在这里插入图片描述

三、运用工厂方法模式

场景假设:我们正在开发一个汽车销售系统,需要根据不同的汽车品牌(如奥迪、宝马)来创建轿车和卡车。

  1. 定义抽象工厂接口: 首先,需要定义一个抽象工厂接口,其中声明了一组用于创建产品的抽象方法。这些方法通常对应于不同产品族的创建。

    // Step 1: 定义抽象工厂接口
    interface CarFactory {Car createCar();Truck createTruck();
    }
    
  2. 定义抽象产品接口: 接着,需要定义一组抽象产品接口或抽象类,其中声明了产品的通用行为或特性。

    // Step 2: 定义抽象产品接口
    interface Car {void drive();
    }interface Truck {void drive();
    }
    
  3. 实现具体产品类: 对于每个产品族,需要实现相应的具体产品类,这些具体产品类分别实现了抽象产品接口,具体描述了产品的特性和行为。

    // Step 3: 实现具体产品类
    class AudiCar implements Car {@Overridepublic void drive() {System.out.println("Driving an Audi car");}
    }class AudiTruck implements Truck {@Overridepublic void drive() {System.out.println("Driving an Audi truck");}
    }class BMWCar implements Car {@Overridepublic void drive() {System.out.println("Driving a BMW car");}
    }class BMWTruck implements Truck {@Overridepublic void drive() {System.out.println("Driving a BMW truck");}
    }
    
  4. 实现具体工厂类: 对于每个产品族,需要实现一个具体工厂类,该类实现了抽象工厂接口,并负责创建该产品族的具体产品对象。

    // Step 4: 实现具体工厂类
    class AudiFactory implements CarFactory {@Overridepublic Car createCar() {return new AudiCar();}@Overridepublic Truck createTruck() {return new AudiTruck();}
    }class BMWFactory implements CarFactory {@Overridepublic Car createCar() {return new BMWCar();}@Overridepublic Truck createTruck() {return new BMWTruck();}
    }
    
  5. 客户端使用抽象工厂: 最后,客户端通过抽象工厂接口来获取产品对象,而不直接依赖于具体的产品类。客户端只需知道抽象工厂接口和抽象产品接口,而不需要了解具体的产品类。

    // Step 5: 客户端使用抽象工厂
    public class Client {public static void main(String[] args) {// 创建奥迪汽车系列CarFactory audiFactory = new AudiFactory();Car audiCar = audiFactory.createCar();Truck audiTruck = audiFactory.createTruck();audiCar.drive();audiTruck.drive();// 创建宝马汽车系列CarFactory bmwFactory = new BMWFactory();Car bmwCar = bmwFactory.createCar();Truck bmwTruck = bmwFactory.createTruck();bmwCar.drive();bmwTruck.drive();}
    }
    

四、抽象工厂模式的特点

  1. 提供一组相关产品的创建接口: 抽象工厂模式提供了一个抽象工厂接口,其中包含一组用于创建相关产品的方法。这些方法通常对应于不同产品族的创建需求。
  2. 实现产品族的创建: 抽象工厂模式通过具体工厂类的实现来实现不同产品族的创建。每个具体工厂类负责创建特定产品族的对象。
  3. 封装性强: 客户端通过抽象工厂接口来获取产品对象,而不需要了解具体的产品类。这种封装性强的特点使得客户端与具体产品类解耦,从而降低了系统的耦合度。
  4. 易于替换: 在抽象工厂模式中,只需替换具体工厂的实现,即可改变产品系列,而不会影响到客户端的代码。这使得系统更加灵活,并且易于扩展和维护。
  5. 满足单一职责原则: 每个具体工厂类只负责创建特定产品族的对象,符合单一职责原则,使得系统的设计更加清晰和易于理解。
  6. 适用于多个产品族的创建: 抽象工厂模式适用于需要创建一系列相关或相互依赖的对象,并且这些对象通常组成多个产品族的场景。例如,不同操作系统下的界面控件、不同汽车品牌的车型等。

五、抽象工厂模式的应用场景

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

  1. 需要创建一系列相关产品的情况: 当一个系统需要创建一系列相关或相互依赖的对象,并且这些对象通常组成多个产品族时,可以使用抽象工厂模式。例如,GUI 库中不同操作系统下的界面控件(如按钮、文本框)就属于不同的产品族。
  2. 需要跨越多个产品族的对象创建情况: 当一个系统需要跨越多个产品族的对象时,可以使用抽象工厂模式。例如,在汽车销售系统中,根据不同汽车品牌(如奥迪、宝马)来创建轿车和卡车就属于不同的产品族。

六、小结

抽象工厂模式是一种强大的设计模式,它提供了一种灵活的方法来创建一系列相关的对象,并且能够有效地降低系统的耦合度。通过将对象的创建与其使用分离,抽象工厂模式使得系统更加灵活、可扩展,并且易于维护。在实际开发中,合理地运用抽象工厂模式可以使代码更加清晰、结构更加健壮。

推荐阅读

  1. Spring 三级缓存
  2. 深入了解 MyBatis 插件:定制化你的持久层框架
  3. Zookeeper 注册中心:单机部署
  4. 【JavaScript】探索 JavaScript 中的解构赋值
  5. 深入理解 JavaScript 中的 Promise、async 和 await

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

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

相关文章

Linux 使用 yum安装 ELK服务,yum 安装elasticsearch和Kibana(未写完)

文章目录 环境准备ELK组件介绍安装Elasticsearch安装Kibana 丢弃下载ELK 服务安装包Elasticsearch安装 Tips:关闭elasticsearch https 环境准备 ELK组件介绍 ElasticSearch : 是一个近实时(NRT)的分布式搜索和分析引擎,它可以用…

PyQt6实战 | 绘图画板程序 自由绘制 直线 矩形 椭圆 画笔颜色和大小选择

引言 本文将介绍如何使用 PyQt6 创建一个简单的绘图应用程序。这个应用程序实现了常用的绘图功能,如自由绘制、画直线、矩形和椭圆。此外,还提供了选择画笔颜色、调整画笔宽度、清空画布和导出图像的功能。 环境设置 首先,需要安装 PyQt6&a…

OrangePi AIpro评测 - AI服务篇

0. 环境 ●OrangePi AIpro ●windows电脑 ●路由器 之前我已经对OrangePi AIpro进行了些嵌入式基本操作的评测。接下来进行AI部分。来看看华为昇腾的特别之处。 1.普通CPU和AI CPU 这里请提前用调试串口或者ssh到板子上,记得用户名和密码,分别是HwHiAiUs…

【Mybatis】映射文件获取新增记录的id

我们在讲JDBC的时候讲过在插入新数据值的时候需要获得到自动生成的那个主键id的值 ①获取PreparedStatement的对象的时候 PreparedStatement st conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS ); ②在执行SQL语句后 st.executeUpdate();ResultSet rs st.ge…

马斯克:AI时代人人高收入,不需要工作,商品服务不再短缺,可能性80%

当前人工智能现状和未来如何?AI时代下,人类未来会发生哪些变化? 埃隆马斯克(Elon Musk)在2024 VivaTech大会上分享了关于地球未来的诸多愿景。 投资作业本课代表摘录了其中的要点,分享给大家&#xff1a…

Golang的基本使用

目录 变量的声明 Golang常用容器 defer 有趣的多态 结构体标签和reflect 反射 Golang最强的协程 channel go可能造成的内存泄露 变量的声明 方法 1:有类型,有var,不赋值 在Golang中默认值为0 方法 2:无类型,有var,赋值 方法 3:无类型,无var,赋值 多变量声明 多变…

强大友好的Nginx扩展:VeryNginx

VeryNginx: 简化Web管理,增强网站防御- 精选真开源,释放新价值。 概览 VeryNginx是一个基于lua-nginx-module(openresty)的高效、友好的Nginx版本,专为满足现代Web应用的需求而设计。它不仅提供了强大的We…

spring-boot 3.2 + spring-boot-starter-quartz + HikariCP配置

第一步&#xff0c;添加 spring-boot-starter-quartz 的 maven 依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> 第二步&#xff0c;在 ap…

Adobe Animate AN v24.0.2 安装教程 (动画特效设计及合成工具)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 安装教程 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 安装教程 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 安装教程 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 安装…

SSE(Server Sent Event) 踩坑留念

整条链路是 客户端A --> 服务端 A —> 服务端 B 我负责服务端 A 此时要注意 Client 中的 processes 的写法 Post(value “/v2/xx”, processes MediaType.TEXT_EVENT_STREAM) 这样写是一直报错的 改成下面的写法才可以 Post(value “/v2/xx”, processes MediaT…

【荐闻】空中目标检测综述

https://t.zsxq.com/tgUjbhttps://t.zsxq.com/tgUjb 这篇综述论文全面回顾了空中目标检测的最新进展&#xff0c;包括五个不平衡问题、相关方法、实际应用和性能评估。以下是对论文内容的详细描述&#xff1a; 1&#xff09;引言&#xff1a;介绍了空中目标检测的概念&#x…

Ubuntu22.04之扩展并挂载4T硬盘(二百三十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

工控屏(触摸屏)怎么连接电脑

一、使用USB接口连接 连接方法&#xff1a;使用USB线连接触摸屏和电脑&#xff0c;触摸屏会自动识别并连接到电脑上。 二、使用HDMI接口连接 连接方法&#xff1a;1.首先要确认您的触摸屏是否有HDMI接口&#xff1b;2.将一端连接到触摸屏&#xff0c;另一端连接到电脑&#…

选择排序与堆排序

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 关注博主带你了解更多数据结构知识 1.选择排序 第一种方法:直接定义一个 i下标 和 j下标(ji1) ,再定义minIdex下标 让 minIdex i, 开始遍历数组,过程中 如果j下标的值大于minIdex下标的值就交换,然…

JVM 常见配置参数

JVM 配置常见参数 Java虚拟机的参数&#xff0c;在启动jar包的时候通过java 命令指定JVM参数 -options表示Java虚拟机的启动参数&#xff0c;class为带有main()函数的Java类&#xff0c;args表示传递给主函数main()的参数。 一、系统查看参数: -XX:PrintVMOptions可以在程序…

超越连接:ZL-450边缘网关全面评测与应用案例

前言 在现代工业自动化和智能设备管理的背景下&#xff0c;对实时数据通信与设备监控的需求日益增加。ZL450边缘网关作为一款先进的串口通信解决方案&#xff0c;不仅满足了这些要求&#xff0c;还通过其多样的连接性和高效的数据处理能力&#xff0c;为企业带来了显著的效率提…

R可视化:另类的箱线图

介绍 方格状态的箱线图 加载R包 knitr::opts_chunk$set(echo TRUE, message FALSE, warning FALSE) library(patternplot) library(png) library(ggplot2) library(gridExtra)rm(list ls()) options(stringsAsFactors F)导入数据 data <- read.csv(system.file(&qu…

IDEA 上方添加左右箭头按钮

IDEA 版本&#xff1a;2021.3.3 按钮&#xff1a; 左箭头&#xff08;Back&#xff09;&#xff08;快捷键&#xff1a;Ctrl Alt 左箭头&#xff09; 右箭头&#xff08;Forward&#xff09;&#xff08;快捷键&#xff1a;Ctrl Alt 右箭头&#xff09; 日常写代码中经常…

大字体学生出勤记录系统网页源码

源码介绍 上课需要一个个点名记录出勤情况&#xff0c;就借助AI制作了一个网页版学生出勤记录系统&#xff0c; 大字体显示学生姓名和照片&#xff0c;让坐在最后排学生也能看清楚&#xff0c;显示姓名同时会语音播报姓名&#xff0c; 操作很简单&#xff0c;先导入学生姓名…

设计模式 19 模板模式 Template Pattern

设计模式 19 模板模式 Template Pattern 1.定义 模板模式&#xff08;Template Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个算法的骨架&#xff0c;将一些步骤的具体实现延迟到子类中。在模板模式中&#xff0c;定义了一个抽象类&#xff0c;其中包含了一个…