软件设计模式: 抽象工厂
抽象工厂
一、解决的问题
抽象工厂模式主要解决了在具有多个产品族的情况下,如何统一管理创建相关产品对象的问题。
当系统需要创建一系列相互关联或相互依赖的对象,并且这些对象可以形成多个不同的产品族时,如果直接由客户端去分别创建这些对象,会导致客户端与具体的产品类紧密耦合,并且当需要切换产品族时,修改的成本会很高。
例如,一个图形用户界面(GUI)应用可能需要为不同的操作系统(如 Windows、Mac、Linux)创建各自风格的按钮、文本框等组件。如果没有抽象工厂模式,客户端代码需要了解每个具体操作系统的组件实现细节,并且在需要切换操作系统支持时,大量的代码都需要修改。
二、好处
- 解耦了客户端与具体产品类
客户端只需要与抽象工厂和抽象产品交互,无需关心具体产品对象的创建细节和具体类,降低了客户端与具体产品类之间的耦合度。
- 便于产品族切换
通过切换使用不同的具体工厂,可以轻松地在不同的产品族之间进行切换,而无需修改客户端的调用代码。
- 统一的产品创建逻辑
将创建相关产品对象的逻辑集中在工厂类中,便于对产品的创建进行统一管理和维护。
三、坏处
- 扩展新的产品族困难
当需要增加一个新的产品族时,需要修改抽象工厂接口以及所有的具体工厂实现类,违背了“开闭原则”(对扩展开放,对修改关闭),可能会影响到已有的代码。
- 代码结构复杂
抽象工厂模式增加了系统中类的数量和层次结构,使得代码结构相对复杂,对于简单的应用场景,可能会导致过度设计。
文章目录
- 抽象工厂
- 一、抽象工厂模式介绍
- 二、Java 代码示例
一、抽象工厂模式介绍
抽象工厂模式(Abstract Factory Pattern)属于创建型设计模式。它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂模式的主要优点是:易于交换产品系列,由于具体工厂类在一个应用中只需要在初始化的时候出现一次,这使得改变一个应用的具体工厂变得非常容易;它让具体的创建实例过程与客户端分离,客户端是通过抽象工厂和抽象产品来操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
抽象工厂模式的缺点是:如果要增加新的产品系列,需要修改抽象工厂和所有的具体工厂类,这违背了“开闭原则”。
二、Java 代码示例
以下是一个使用 Java 实现的抽象工厂模式的示例,假设我们有两个产品系列:Windows
系列的窗口组件(按钮和文本框)和 Mac
系列的窗口组件:
// 按钮接口
interface Button {void paint();
}// Windows 风格的按钮
class WindowsButton implements Button {@Overridepublic void paint() {System.out.println("Painting Windows Button");}
}// Mac 风格的按钮
class MacButton implements Button {@Overridepublic void paint() {System.out.println("Painting Mac Button");}
}// 文本框接口
interface TextBox {void show();
}// Windows 风格的文本框
class WindowsTextBox implements TextBox {@Overridepublic void show() {System.out.println("Showing Windows TextBox");}
}// Mac 风格的文本框
class MacTextBox implements TextBox {@Overridepublic void show() {System.out.println("Showing Mac TextBox");}
}// 抽象工厂接口
interface GUIFactory {Button createButton();TextBox createTextBox();
}// Windows 风格的工厂,用于创建 Windows 风格的组件
class WindowsFactory implements GUIFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic TextBox createTextBox() {return new WindowsTextBox();}
}// Mac 风格的工厂,用于创建 Mac 风格的组件
class MacFactory implements GUIFactory {@Overridepublic Button createButton() {return new MacButton();}@Overridepublic TextBox createTextBox() {return new MacTextBox();}
}// 客户端代码
public class AbstractFactoryPatternDemo {public static void main(String[] args) {GUIFactory factory;// 创建 Windows 风格的工厂factory = new WindowsFactory();Button windowsButton = factory.createButton();TextBox windowsTextBox = factory.createTextBox();windowsButton.paint();windowsTextBox.show();// 创建 Mac 风格的工厂factory = new MacFactory();Button macButton = factory.createButton();TextBox macTextBox = factory.createTextBox();macButton.paint();macTextBox.show();}
}
相关文章:
软件设计模式: 抽象工厂
抽象工厂 一、解决的问题 抽象工厂模式主要解决了在具有多个产品族的情况下,如何统一管理创建相关产品对象的问题。 当系统需要创建一系列相互关联或相互依赖的对象,并且这些对象可以形成多个不同的产品族时,如果直接由客户端去分别创建这…...
使用Vuepress搭建个人网站
网站地址:bloggo.chat...
lua 写一个 不同时区之间转换日期和时间 函数
这个函数用于调整时间戳以适应不同的时区。它接受五个参数:format、timeStamp、dontFixForTimeOffset、currentServerTimeZone和showLog。返回 os.date,可以转化成指定格式的年月日时间 ### 功能 该函数的主要功能是根据给定的时区偏移量调整时间戳&am…...
谷粒商城——session共享
问题1 一个系统中不同微服务的session共享。 问题1的解决办法 1. session复制的方法:微服务的副本之间通过通信共享session。这样每一个微服务的副本都会保存所有的session。(缺点:造成大量的通信,多处额外的通信开销。&#x…...
Java 语言及其常用集合类的操作,以及反射机制与注解
目录 一、Java 语言概述 二、Java 集合框架 ArrayList 操作示例: HashMap 操作示例: 三、反射机制 1. 反射的示例 五、总结 Java 是一种广泛使用的高级编程语言,因其平台独立性、简洁性及丰富的 API 而备受开发者青睐。 一、Java 语言…...
《系统架构设计师教程(第2版)》第12章-信息系统架构设计理论与实践-02-信息系统架构
文章目录 1. 概述1.1 信息系统架构(ISA)1.2 架构风格 2. 信息系统架构分类2.1 信息系统物理结构2.1.1 集中式结构2.1.2 分布式结构 2.2 信息系统的逻辑结构1)横向综合2)纵向综合3)纵横综合 3. 信息系统架构的一般原理4…...
用html做python教程01
用html做python教程01 前言开肝构思实操额外修饰更换字体自适应 最后 前言 今天打开csdn的时候,看见csdn给我推荐了一个python技能书。 说实话,做得真不错。再看看我自己,有亿点差距😟。 开肝 先创建一个文件,后缀…...
PHP接口与性状的优雅应用
本文由 ChatMoney团队出品 在PHP编程中,接口是一种定义对象之间交互契约的强大工具。其核心目的不是让一个对象紧耦合地依赖另一个对象的特定身份,而是基于另一对象的能力进行交互。通过接口,我们的代码可以实现与依赖的解耦,从而…...
R语言模型评估网格搜索
### 网格搜索 ### install.packages("gbm") set.seed(1234) library(caret) library(gbm) fitControl <- trainControl(method = repeatedcv,number = 10,repeats = 5) # 设置网格搜索的参数池 gbmGrid <- expand.grid(interaction.depth = c(3,5,9),n.trees =…...
Haproxy服务
目录 一.haproxy介绍 1.主要特点和功能 2.haproxy 调度算法 3.haproxy 与nginx 和lvs的区别 二.安装 haproxy 服务 1. yum安装 2.第三方rpm 安装 3.编译安装haproxy 三.配置文件详解 1.官方地址配置文件官方帮助文档 2.HAProxy 的配置文件haproxy.cfg由两大部分组成&…...
Unity VR开发入门:探索虚拟现实世界的无限可能
目录 引言 Unity VR开发基础 1. 安装Unity与VR SDK 2. 创建VR项目 3. 理解VR场景结构 Unity VR开发实战 1. 场景搭建 2. 交互设计 创建C#脚本 编写VRInteractor脚本 应用脚本到场景 注意 修改VRInteractor脚本 3. 用户体验优化 4. 测试与调试 引言 随着科技的飞速…...
系统架构设计师教程(清华第二版) 第3章 信息系统基础知识-3.2 业务处理系统-解读
教材中,一会儿“业务处理系统”,一会儿“事务处理系统”,语法毛病一堆。真是清华的水平!!! 系统架构设计师教程 第3章 信息系统基础知识-3.2 业务处理系统 3.2.1 业务处理系统的概念3.2.2 业务处理系统的功能3.2.2.1 数据输入3.2.2.2 数据处理3.2.2.2.1 批处理 (Batch …...
32_ConvNeXt网络详解
1.1 简介 ConvNeXt是一种计算机视觉模型,由Meta AI(前Facebook AI)的研究人员在2022年提出,它旨在探索卷积神经网络(CNN)在图像识别任务上的潜力,尤其是在与当时流行的Vision Transformer&…...
Langchain[3]:Langchain架构演进与功能扩展:流式事件处理、事件过滤机制、回调传播策略及装饰器应用
Langchain[3]:Langchain架构演进与功能扩展:流式事件处理、事件过滤机制、回调传播策略及装饰器应用 1. Langchain的演变 v0.1: 初始版本,包含基本功能。 从0.1~0.2完成的特性: 通过事件流 API 提供更好的流式支持。标准化工具调用支持Tool…...
java导出PDF详细教程+各种踩坑
直接上代码了 所需依赖: <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.4.3</version> </dependency><dependency><groupId>com.itextpdf</groupId><art…...
【博士每天一篇文献-算法】连续学习算法之HNet:Continual learning with hypernetworks
阅读时间:2023-12-26 1 介绍 年份:2019 作者:Johannes von Oswald,Google Research;Christian Henning,EthonAI AG;Benjamin F. Grewe,苏黎世联邦理工学院神经信息学研究所 期刊&a…...
使用 tcpdump 进行网络流量捕获与分析
目录 安装 tcpdump基本用法捕获网络流量指定网络接口捕获特定主机的流量捕获特定端口的流量捕获特定协议的流量 常用选项保存捕获的数据包从文件读取数据包显示数据包内容指定捕获数据包的长度限制捕获的数据包数量显示详细信息过滤表达式 示例捕获本地回环接口上的HTTP流量捕获…...
k8s集群 安装配置 Prometheus+grafana
k8s集群 安装配置 Prometheusgrafana k8s环境如下:机器规划: node-exporter组件安装和配置安装node-exporter通过node-exporter采集数据显示192.168.40.180主机cpu的使用情况显示192.168.40.180主机负载使用情况 Prometheus server安装和配置创建sa账号&…...
【Java--数据结构】二叉树oj题(上)
前言 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 判断是否是相同的树 oj链接 要判断树是否一样,要满足3个条件 根的 结构 和 值 一样左子树的结构和值一样右子树的结构和值一样 所以就可以总结以下思路…...
微服务之间Feign调用
需使用的服务 FeignClient(name "rdss-back-service", fallback SysUserServiceFallback.class, configuration FeignConfiguration.class) public interface SysUserService {/*** 订单下单用户模糊查询*/GetMapping(value "/user/getOrderUserName")…...
【Qt】按钮的属性相关API
目录 一. QPushButton 二. QRadioButton 按钮组 三. QCheckBox Qt中按钮的继承体系如下图 QAbstractButton是一个抽象类,集成了按钮的核心属性和API 按钮说明QPushButton(普通按钮)最常见的按钮,用于触发操作或者事件。可以设…...
blender和3dmax和maya和c4d比较
Blender、3ds Max、Maya和Cinema 4D (C4D)都是强大的3D建模和动画软件,但它们各有特点和适用领域。以下是它们的比较: Blender: 开源免费全面的功能,包括建模、动画、渲染、视频编辑等学习曲线较陡峭,但社区支持强大适合独立艺术家…...
visio保存一部分图/emf图片打开很模糊/emf插入到word或ppt中很模糊
本文主要解决三个问题 visio保存一部分图 需求描述:在一个visio文件中画了很多个图,但我只想把其中一部分保存成某种图片格式,比如jpg emf png之类的,以便做后续的处理。 方法:超级容易。 选中希望保存的这部分图&…...
沙尘传输模拟教程(基于wrf-chem)
沙尘传输模拟教程(基于wrf-chem) 文章目录 沙尘传输模拟教程(基于wrf-chem)简介实验目的wrf-chem简介 软件准备wps、wrf-chem安装conda安装ncl安装ncap安装 数据准备气象数据准备下垫面数据准备 WPS数据预处理namelist.wps的设置geogrid.exe下垫面处理ungrib.exe气象数据预处理…...
使用 Python 进行测试(8)纯净测试
原文:Testing with Python (part 8): purity test 总结 如果你要使用综合测试(integrated tests): def test_add_new_item_to_cart(product, cart):new_product Product.objects.create(nameNew Product, price15.00)new_cart…...
python的tkinter、socket库开发tcp的客户端和服务端
一、tcp通讯流程和开发步骤 1、tcp客户端和服务端通讯流程图 套接字是通讯的利器,连接时要经过三次握手建立连接,断开连接要经过四次挥手断开连接。 2、客户端开发流程 1)创建客户端套接字 2)和服务端器端套接字建立连接 3&#x…...
Python面试题:Python中的异步编程:详细讲解asyncio库的使用
Python 的异步编程是实现高效并发处理的一种方法,它使得程序能够在等待 I/O 操作时继续执行其他任务。在 Python 中,asyncio 库是实现异步编程的主要工具。asyncio 提供了一种机制来编写可以在单线程内并发执行的代码,适用于 I/O 密集型任务。…...
【信号频率估计】MVDR算法及MATLAB仿真
目录 一、MVDR算法1.1 简介1.2 原理1.3 特点1.3.1 优点1.3.2 缺点 二、算法应用实例2.1 信号的频率估计2.2 MATLAB仿真代码 三、参考文献 一、MVDR算法 1.1 简介 最小方差无失真响应(Mininum Variance Distortionless Response,MVDR)算法最…...
HarmonyOS NEXT零基础入门到实战-第二部分
HarmonyOS NEXT零基础入门到实战-第二部分 Swiper 轮播组件 Swiper是一个 容器 组件,当设置了多个子组件后,可以对这些 子组件 进行轮播显示。(文字、图片...) 1、Swiper基本语法 2、Swiper常见属性 3、Swiper样式自定义 4、案例&…...
《小程序02:云开发之增删改查》
一、前置操作 // 一定要用这个符号包含里面的${}才会生效 wx.showToast({title: 获取数据成功:${colorLista}, })1.1:初始化介绍 **1、获取数据库引用:**在开始使用数据库 API 进行增删改查操作之前,需要先获取数据库的引用 cons…...
做ppt的兼职网站/汕头网站建设方案外包
技术面:自我介绍项目介绍xml的使用多线程的使用,使用场景sleep和wait的区别servlet和cgi的区别索引的实现内存结构跟别人比,你的优势综合面:略。。。转载于:https://blog.51cto.com/12159803/1916431...
在线旅游网站建设方案/设计网站logo
使用redis在同一台机器上,启用多个端口,实现多个实例,完成集群的模拟实现。 启动多实例redis默认启动端口为6379,我们可以使用 --port 来指定多个端口,如下,在linux终端命令: redis-server &…...
wordpress 两个导航/深圳seo优化服务
ColorPicker一款仿Photoshop取色器的Android版取色器。前言上一篇已经简单介绍了ColorPicker的核心自定义控件ColorPickerView的绘制流程。接下来我们详细解析一下ColorPickerView的监听事件相关代码。注:初始颜色传入在讲颜色改变监听之前,先来讲讲初始…...
重庆电商网站建设费用/手机百度搜索引擎入口
异步初步了解: 今天学es6中碰到关于异步(Asynchronous)的问题,然后觉得听到异步这个词自己知道是个什么意思,但是如果要自己用代码解释出来的话.....所以慢慢整理了一些东西如下: 1. 说到异步,肯…...
长春建设局网站/seo招聘
记下吧,省得又忘记。Java配置环境变量,在系统变量内新建,若存在则编辑JAVA_HOMEC:\Program Files\Java\jdk1.6.0_29Path%JAVA_HOME%/bin;%JAVA_HOME%/jre/binjavah生成.h进入工程目录下的...\bin\classesjavah -classpath 包名.类名也可看jav…...
电子商务网站建设也管理/近几天发生的新闻大事
asp.net编写登录注册代码 win7 asp.netms sql 2005vs2010(开发平台)数据库名userinfousername varchar(50) userpassword varchar(50) 连接数据库,写在类db.cs里面,其代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; usi…...