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

抽象工厂模式的理解和实践

        在软件开发中,设计模式是解决常见问题的最佳实践。抽象工厂模式是一种创建型设计模式,提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。本文将详细解释抽象工厂模式的概念、结构、优点、缺点,并通过Java代码示例进行实践。

 

一、抽象工厂模式的概念

        抽象工厂模式起源于对操作系统图形化界面控件的实现。不同操作系统中的按钮(Button)和文本框(Textbox)控件虽然功能相似,但实现和展示效果却各不相同。例如,Android中的Button和TextView、iOS中的UIButton和UILabel、Windows Phone中的Button和TextBlock。抽象工厂模式将这些控件抽象为不同的产品族,并提供一个统一的接口来创建这些产品族中的对象。

        抽象工厂模式定义了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。它使得客户端代码与具体产品类解耦,提高了代码的可维护性和可扩展性。

二、抽象工厂模式的结构

        抽象工厂模式通常由以下几个角色组成:

  1. 抽象产品(Abstract Product):定义产品的接口,描述产品的主要功能和特性。
  2. 具体产品(Concrete Product):实现抽象产品接口的具体类,代表不同品牌或类型的产品。
  3. 抽象工厂(Abstract Factory):声明一个创建抽象产品对象的操作接口。
  4. 具体工厂(Concrete Factory):实现抽象工厂接口,创建具体产品对象的类。
  5. 客户端(Client):使用抽象工厂和抽象产品接口,通过具体工厂获取具体产品对象。

三、抽象工厂模式的优点

  1. 封装性:客户端代码与具体产品类解耦,通过抽象工厂和抽象产品接口进行交互。
  2. 扩展性:当需要增加新的产品族时,只需增加新的具体产品和具体工厂,无需修改客户端代码。
  3. 灵活性:可以方便地切换不同产品族,而无需修改客户端代码。

四、抽象工厂模式的缺点

  1. 复杂性:抽象工厂模式增加了系统的抽象层次和复杂度,对于简单系统可能并不适用。
  2. 增加新产品困难:当需要为产品族增加新产品时,需要修改抽象工厂和抽象产品接口,增加了系统的维护成本。
  3. 难以支持多变化:当产品族中的产品种类非常多时,抽象工厂接口会变得非常复杂,难以维护。

五、抽象工厂模式的实践

        下面通过Java代码示例来演示抽象工厂模式的具体实现。

1. 定义抽象产品

        首先,我们定义两个抽象产品:Button和Textbox。

// 抽象产品:Button
public interface Button {void render();
}// 具体产品:AndroidButton
public class AndroidButton implements Button {@Overridepublic void render() {System.out.println("Render Android Button");}
}// 具体产品:iOSButton
public class iOSButton implements Button {@Overridepublic void render() {System.out.println("Render iOS Button");}
}// 抽象产品:Textbox
public interface Textbox {void displayText();
}// 具体产品:AndroidTextbox
public class AndroidTextbox implements Textbox {@Overridepublic void displayText() {System.out.println("Display Android Textbox");}
}// 具体产品:iOSTextbox
public class iOSTextbox implements Textbox {@Overridepublic void displayText() {System.out.println("Display iOS Textbox");}
}


2. 定义抽象工厂

        接下来,我们定义抽象工厂接口,用于创建Button和Textbox对象。

// 抽象工厂
public interface GUIFactory {Button createButton();Textbox createTextbox();
}


3. 定义具体工厂

        然后,我们定义具体工厂类,分别用于创建Android和iOS的Button和Textbox对象。

// 具体工厂:AndroidFactory
public class AndroidFactory implements GUIFactory {@Overridepublic Button createButton() {return new AndroidButton();}@Overridepublic Textbox createTextbox() {return new AndroidTextbox();}
}// 具体工厂:iOSFactory
public class iOSFactory implements GUIFactory {@Overridepublic Button createButton() {return new iOSButton();}@Overridepublic Textbox createTextbox() {return new iOSTextbox();}
}


4. 定义客户端代码

        最后,我们定义客户端代码,通过抽象工厂接口获取具体产品对象,并进行操作。

// 客户端代码
public class Application {private Button button;private Textbox textbox;// 构造器,注入抽象工厂public Application(GUIFactory factory) {button = factory.createButton();textbox = factory.createTextbox();}// 使用产品对象public void run() {button.render();textbox.displayText();}public static void main(String[] args) {// 使用AndroidFactory创建产品对象Application androidApp = new Application(new AndroidFactory());androidApp.run();// 使用iOSFactory创建产品对象Application iosApp = new Application(new iOSFactory());iosApp.run();}
}


5. 运行结果

        运行客户端代码,输出结果如下:

Render Android Button
Display Android Textbox
Render iOS Button
Display iOS Textbox


总结

        抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。它通过将具体产品类封装在具体工厂中,使得客户端代码与具体产品类解耦,提高了代码的可维护性和可扩展性。然而,抽象工厂模式也增加了系统的抽象层次和复杂度,适用于需要创建多个产品族且这些产品族之间具有相互依赖关系的场景。

        通过本文的详细解释和Java代码示例,相信读者已经对抽象工厂模式有了深入的理解和实践经验。在实际开发中,应根据具体需求选择合适的设计模式,以提高代码的质量和可维护性。

相关文章:

抽象工厂模式的理解和实践

在软件开发中,设计模式是解决常见问题的最佳实践。抽象工厂模式是一种创建型设计模式,提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。本文将详细解释抽象工厂模式的概念、结构、优点、缺点,并通过Java代…...

WIDER FACE数据集转YOLO格式

1. 引出问题 本人最近在做毕设相关内容,第一阶段目标是通过目标检测来统计课堂人数,因此需要对人脸和人头进行目标检测。模型方面没什么好说的无脑用YOLO,数据集方面,人脸部分找到了来自港中文的WIDER FACE数据集。但是解压后发现…...

项目启动的基本配置

开启驼峰命名 如果字段名与属性名符合驼峰命名规则,MyBatis会自动通过驼峰命名规则映射。 在application.yml配置文件中,可以添加以下配置来开启驼峰命名规则: mybatis:configuration:map-underscore-to-camel-case: true 这段配置的作用…...

Ubuntu桌面突然卡住,图形界面无反应

1.可能等待几分钟,系统会自动反应过来。你可以选择等待几分钟。 2.绝大多数情况系统是不会反应过来的,这时候可以进入tty终端直接注销用户。 (1)Ubuntu有6个tty终端,按住CtrlAltF1可以进入tty1终端,(同理CtrlAltF2&a…...

Next.js系统性教学:拦截路由与路由处理器

更多有关Next.js教程,请查阅: 【目录】Next.js 独立开发系列教程-CSDN博客 目录 1. 路由拦截 (Intercepting Routes) 1.1 什么是路由拦截? 1.2 配置拦截路由 1.3 示例:模态框预览 1.4 使用场景 2. 路由处理器 (Route Handl…...

Python编码风格

Python代码的常用排版格式主要遵循PEP 8规范,这是Python社区广泛接受的编码风格指南。以下是一些关键的排版格式要求: 一、缩进 使用4个空格作为缩进级别,不要使用Tab键,更不能混合使用Tab和空格。 二、行长度 每行代码的最大…...

flask创建templates目录存放html文件

首先,创建flask项目,在pycharm中File --> New Project,选择Flask项目。 然后,在某一目录下,新建名为templates的文件夹,这时会是一个普通的文件夹。 然后右击templates文件夹,选择Unmark as …...

微信小程序里的小游戏研发需要什么技术栈

研发小程序里的小游戏通常需要以下技术栈: 前端技术 HTML5 / CSS3:用于构建游戏的界面布局和样式。JavaScript:作为核心编程语言,实现游戏的逻辑和交互。小程序开发框架:如微信小程序的开发框架,了解其 API…...

2024年上半年网络工程师案例分析真题及答案解析

2024年上半年网络工程师案例分析真题及答案解析 1、试题一(20分) 阅读以下说明,回答问题。 [说明]某高校网络拓扑如下图所示,两校区核心(CORE-1,CORE-2),出口防火墙(NGFW-1,NGFW-2)通过校区间光缆互联,配置OSPF实现全校路由收效,校区相距40km。两校区默认由本地出…...

Ant Design Vue v4版本如何解决1px没有被postcss-px2rem转成rem的问题

背景说明 如果你的 Ant Design Vue 项目有要做适配的需求,那首先要选择一种适配方案。笔者选择的是用 postcss-px2rem 进行适配。笔者在配置了 postcss-px2rem的相关配置后,发现 postcss-px2rem 没有对 Ant Design Vue 进行适配。在网上看了一些文章之后…...

武汉科技大学《2024年814自动控制原理真题》 (完整版)

本文内容,全部选自自动化考研联盟的:《武汉科技大学814自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题...

【锂电池实战】A123磷酸铁锂在线参数识别-一阶戴维南模型

A123磷酸铁锂在线参数识别-一阶戴维南模型 提要 理论介绍:一篇就够了,为你答疑解惑:锂电池一阶模型-在线参数辨识(附代码)_在线参数辨识方法-CSDN博客 数据源:Battery Data | Center for Advanced Life Cycle Engineering 打包下载地址:A123-DST-US06-FUDS-25.zip资源…...

Java多线程与线程池技术详解(四)

接受失败:“失败是什么?没有什么,只是更走近成功一步;成功是什么?就是走过了所有通向失败的路,只剩下一条路,那就是成功的路。”这句话很好地诠释了如何看待失败的问题,即每一次跌倒…...

树莓派开发笔记

一. 登录方式 1.1 方式一:HDMI视频线 1.2 方式二:串口 查看串口有否被加密,默认情况下树莓派串口和蓝牙连接,需先断开蓝牙连接,串口才能用于数据通信。 1.2.1 如何使用串口登录 打开SD卡根目录的"config.txt"文件,将以下内容添加在最后并且保存。这样就停止…...

【数据结构】遍历二叉树

遍历二叉树的算法描述(递归定义) 先序遍历 若二叉树为空,则空操作; 否则 (1)访问根节点 (2)先序遍历左子树 (3)先序遍历右子树 中序遍历 若二叉树为空…...

嵌入式蓝桥杯学习7 产生PWM

Cubemx配置 打开cubemx,前面的配置看上文,这里主要配置定时器产生PWM波。 以PA1的TIM2-CH2通道为例进行演示。 1.在Timers中打开TIM2,将Channel2配置为PWM Generation CH2。 2.将Clock Source 选择为Internal Clock。 3.配置Paramater Settings中的参…...

档案学实物

档案工作 档案工作的性质 服务性 文化性 管理性 政治性 科学性 档案工作的地位 档案工作的效益 社会性,隐蔽性,滞后性 档案工作的发展规律 档案收集 档案收集工作的内容意义 档案收集工作的具体要求 档案室的档案收集工作 档案馆的档案收集工作 档案…...

数据清洗代码:缺失值,异常值,离群值Matlab处理

目录 基本介绍程序设计参考资料基本介绍 一、过程概述 本过程适用于处理SCADA系统采集到的数据,以及具有类似需求的数据集。处理步骤包括缺失值处理、异常值处理和离群值处理,旨在提升数据质量,增强数据的相关性,同时保持数据的原始特征和随机性。 二、缺失值处理 对于SC…...

Windows设备go环境安装配置

一、下载go安装包 官网链接:All releases - The Go Programming Language (google.cn) 安装过程比较简单,这里不再赘述,可参考这位博主的文章。本文重点在环境配置。golang环境详细安装、配置_golang安装-CSDN博客 二、环境变量配置 1.添…...

导体、半导体和绝缘体

半导体可以根据不同的组合去改变电阻,所以可以用来制作芯片。...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

边缘计算网关提升水产养殖尾水处理的远程运维效率

一、项目背景 随着水产养殖行业的快速发展&#xff0c;养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下&#xff0c;而且难以实现精准监控和管理。为了提升尾水处理的效果和效率&#xff0c;同时降低人力成本&#xff0c;某大型水产养殖企业决定…...