Java设计模式-抽象工厂模式

抽象工厂模式

简介

设计模式是软件设计中的一种常见方法,通过定义一系列通用的解决方案,来解决常见的软件设计问题。其中,抽象工厂模式是一种非常常见的设计模式,它可以帮助我们创建一组相关的对象,而不需要指定具体的实现方式。

抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关的对象,而不需要暴露具体的实现方式。通过使用抽象工厂模式,我们可以把客户端与具体实现分离,从而提高代码的可维护性和可扩展性。

抽象工厂模式的主要用途是创建一组相关的对象。例如,在一个游戏中,我们需要创建一组不同种类的武器、防具和道具。这些对象可能有不同的实现方式,但是它们都属于同一组对象。通过使用抽象工厂模式,我们可以将它们的创建逻辑封装在一个工厂中,从而简化客户端代码。

在软件设计中,有很多与抽象工厂模式相似的设计模式,如工厂方法模式和建造者模式。这些模式也可以用来创建对象,但它们和抽象工厂模式之间存在一些区别。

  • 工厂方法模式

工厂方法模式和抽象工厂模式都可以用来创建对象,但是它们之间有一个重要的区别。在工厂方法模式中,我们只需要实现一个工厂方法,它负责创建一个特定类型的对象。而在抽象工厂模式中,我们需要实现一个工厂接口,它负责创建一组相关的对象。

  • 建造者模式

建造者模式是一种用于创建复杂对象的设计模式。它可以将一个复杂对象的构造逻辑拆分成多个简单的部分,并且允许客户端按照需要组装这些部分。与抽象工厂模式相比,建造者模式更加灵活,但是它也更加复杂。

实现

我们可以通过定义一个抽象工厂接口和多个具体工厂来实现抽象工厂模式。具体工厂实现工厂接口,并且负责创建一组相关的对象。

下面是一个使用抽象工厂模式创建按钮和文本框的示例。我们定义了一个抽象工厂接口GUIFactory,它包含了两个方法:createButton()createTextBox()。同时,我们也定义了两个具体工厂类WinFactoryMacFactory,它们都实现了GUIFactory接口,并且负责创建特定平台下的按钮和文本框,代码如下:

// 抽象工厂接口
interface GUIFactory {Button createButton();TextBox createTextBox();
}// 具体工厂类 - Windows工厂
class WinFactory implements GUIFactory {public Button createButton() {return new WinButton();}public TextBox createTextBox() {return new WinTextBox();}
}// 具体工厂类 - Mac工厂
class MacFactory implements GUIFactory {public Button createButton() {return new MacButton();}public TextBox createTextBox() {return new MacTextBox();}
}

我们还定义了两个按钮类ButtonWinButton,以及两个文本框类TextBoxWinTextBox。它们都是抽象类或接口,具体实现由具体工厂类来完成。

// 抽象按钮类
abstract class Button {public abstract void paint();
}// 抽象文本框类
abstract class TextBox {public abstract void paint();
}// Windows按钮类
class WinButton extends Button {public void paint() {System.out.println("Windows按钮");}
}// Windows文本框类
class WinTextBox extends TextBox {public void paint() {System.out.println("Windows文本框");}
}

我们还定义了Mac按钮类MacButton和Mac文本框类MacTextBox,具体实现和Windows下的按钮和文本框类似,这里就不一一列举了。

// Mac按钮类
class MacButton extends Button {public void paint() {System.out.println("Mac按钮");}
}// Mac文本框类
class MacTextBox extends TextBox {public void paint() {System.out.println("Mac文本框");}
}

使用抽象工厂模式,我们可以轻松地创建不同平台下的按钮和文本框,而不需要暴露具体的实现方式。例如,在Windows平台下,我们可以使用WinFactory来创建按钮和文本框:

GUIFactory factory = new WinFactory();
Button button = factory.createButton();
TextBox textBox = factory.createTextBox();
button.paint();
textBox.paint();

输出结果为:

Windows按钮
Windows文本框

而在Mac平台下,我们可以使用MacFactory来创建按钮和文本框:

GUIFactory factory = new MacFactory();
Button button = factory.createButton();
TextBox textBox = factory.createTextBox();
button.paint();
textBox.paint();

输出结果为:

Mac按钮
Mac文本框

优缺点

抽象工厂模式的主要优点是:

  • 可以封装一组相关对象的创建逻辑,从而提高代码的可维护性和可扩展性。
  • 可以帮助客户端代码与具体类的解耦,从而提高代码的灵活性和可移植性。
  • 可以通过工厂的切换来实现对不同平台或不同产品系列的支持,同时又不会对客户端代码造成影响。

抽象工厂模式的缺点是:

  • 在新增产品系列时,需要修改工厂接口及所有具体工厂类的实现,从而增加了代码的维护成本。
  • 当产品系列比较复杂时,抽象工厂模式可能会变得比较臃肿。

运用场景

抽象工厂模式通常在以下场景中被使用:

  • 系统需要支持多种产品系列,并且每个产品系列都有相应的抽象工厂、具体工厂和产品类。
  • 系统需要动态地切换产品系列,例如根据用户的操作系统或用户的选择来决定使用哪种产品系列。
  • 系统的产品族和产品等级结构稳定不变,但是仍然需要满足开闭原则,以便在将来新增产品时能够方便地扩展系统功能。

抽象工厂模式在GUI设计、数据库访问、游戏开发等领域得到了广泛的应用,可以说是一种非常实用的设计模式。

总结

抽象工厂模式是一种创建型设计模式,用于封装一组相关对象的创建逻辑,从而提高代码的可维护性、可扩展性和可移植性。该模式通过定义抽象工厂、具体工厂和抽象产品等级结构,将客户端代码与具体类的实现解耦,并且可以实现对不同平台或不同产品系列的支持。抽象工厂模式的主要优点是可以提高代码的灵活性、可维护性和可扩展性,而缺点则是需要修改工厂接口及所有具体工厂类的实现,增加了代码的维护成本。抽象工厂模式通常在需要支持多种产品系列、动态切换产品系列或稳定不变的产品族和产品等级结构的场景中被使用。

  

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

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

相关文章

iPhone 14 Pro 动态岛的功能和使用方法详解

当iPhone 14 Pro机型发布时,苹果公司将软件功能与屏幕顶部的药丸状切口创新集成,称之为“灵动岛”,这让许多人感到惊讶。这篇文章解释了它的功能、工作原理,以及你如何与它互动以执行动作。 一、什么是灵动岛?它是如何工作的 在谣言周期的早期‌iPhone 14 Pro‌ 在宣布时…

uniapp 使用permission获取录音权限

使用前,需要先配置权限 android.permission.RECORD_AUDIO

【Django】 Task5 DefaultRouter路由组件和自定义函数

文章目录 【Django】 Task5 DefaultRouter路由组件和自定义函数1.路由组件1.1路由组件介绍1.2SimpleRouter1.3DefaultRouter1.4DefaultRouter示例1.5查看访问服务接口url 2.自定义函数 【Django】 Task5 DefaultRouter路由组件和自定义函数 Task5 主要了解了DefaultRouter路由…

Spring Data Redis

文章目录 Redis各种Java客户端Spring Data Redis使用方式操作字符串类型的数据操作哈希类型数据列表类型集合类型有序集合类型通用类型 Redis各种Java客户端 Java中如何操作redis,这里主讲IDEA中的框架Spring Data Redis来操作redis Jedis是官方推出的,…

ubuntu18.04复现yolo v8之最终章,realsenseD435i+yolo v8完美运行

背景:上一篇博客我们已经为复现yolov8配置好了环境,如果前面的工作顺利进行,我们已经完成了90%(学习类程序最难的是环境配置)。 接下来将正式下载yolov8的相关代码,以及进行realsenseD435i相机yolo v8的de…

微信小程序 echarts 画多个横向柱状图

然后是json {"usingComponents": {"ec-canvas": "../../common/ec-canvas/ec-canvas"},"navigationBarTitleText": "主题活动" } ec-canvas获取方式 在链接里下载代码 然后copy ec-canvas文件夹到自己的项目 https://gi…

八、pikachu之越权

文章目录 1、越权概述2、水平越权3、垂直越权 1、越权概述 如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。 一般越权漏洞容易…

Python实现企业微信群告警

Python实现企业微信告警 1. 创建企业微信群机器人 1-1. 什么是企业微信群机器人? 企业微信群机器人是企业微信平台提供的一种功能,可以通过Webhook方式将消息发送到指定的企业微信群中。它可以用于自动化发送通知、告警等信息,实现监控和信…

如何利用SFTP协议远程实现更安全的文件传输 ——【内网穿透】

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想,就是为了理想的生活! 文章目录 1. 安装openSSH1.1 安装SSH1.2 启动ssh 2. 安装cpolar2.1 配置termux服务 3. 远程SFTP连接配置3.1 查看生成的随机公…

jenkins Linux如何修改jenkins 默认的工作空间workspace

由于jenkins默认存放数据的目录是/var/lib/jenkins,一般这个var目录的磁盘空间很小的,就几十G,所以需要修改jenkins的默认工作空间workspace 环境 jenkins使用yum安装的 centos 7 正题 1 查看jenkins安装路径 [rootlocalhost jenkins_old_data]# rpm…

unity动画融合

1、抛砖引玉 在大型复杂的场景中,一定遇到过手在鼓掌,头在摇头,腿又是其他动作的要求,但是这些东西又不能做一起,因为有时候要把某个动画单独使用,这时候就用到了动画融合,利用动画状态机分层机…

股票预测和使用LSTM(长期-短期-记忆)的预测

一、说明 准确预测股市走势长期以来一直是投资者和交易员难以实现的目标。虽然多年来出现了无数的策略和模型,但有一种方法最近因其能够捕获历史数据中的复杂模式和依赖关系而获得了显着的关注:长短期记忆(LSTM)。利用深度学习的力…

Redis中的淘汰策略

前言 本文主要说明在Redis面临key过期和内存不足的情况时,可以采用什么策略进行解决问题。 Redis中是如何应对过期数据的 正如我们知道的Redis是基于内存的、单线程的一个中间件,在面对过期数据的时候,Redis并不会去直接把它从内存中进行剔…

【SpringCloud技术专题】「Gateway网关系列」(1)微服务网关服务的Gateway组件的原理介绍分析

为什么要有服务网关? 我们都知道在微服务架构中,系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?难道要一个个的去调用吗?很显然这是不太实际的,我们需要有一个统一的接口与这些微服务打交道&#xf…

Java后端开发面试题——消息中间篇

RabbitMQ-如何保证消息不丢失 交换机持久化: Bean public DirectExchange simpleExchange(){// 三个参数:交换机名称、是否持久化、当没有queue与其绑定时是否自动删除 return new DirectExchange("simple.direct", true, false); }队列持久化…

大数据项目实战(安装准备)

一,搭建大数据集群环境 1.1安装准备 1.1.1虚拟机安装与克隆 1.虚拟机的安装和设置以及启动虚拟机并安装操作系统(以下仅供参考) 安装一台虚拟机主机名为:hadoop01的虚拟机备用 VMware虚拟机安装Linux教程(超详细)_vmware安装…

初始Netty

文章目录 目录 文章目录 前言 一、netty 总结 前言 认识netty 一、netty Netty是一个基于Java的高性能网络应用框架,用于快速开发可扩展的网络服务器和客户端。它提供了易于使用的抽象API,使开发人员能够轻松地构建各种网络应用程序,包括…

【Git】分支管理

文章目录 一、理解分支二、创建、切换、合并分支三、删除分支四、合并冲突五、合并模式六、分支策略七、bug分支八、强制删除分支 努力经营当下 直至未来明朗! 一、理解分支 HEAD指向的是master分支,master中指向的是最新一次的提交,也就是m…

消息中间件介绍

消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如ActiveMQ、RabbitMQ,Kafka,还有阿里巴巴…

ElementUI中的日历组件加载无效的问题

在ElementUI中提供了一个日历组件。在某些场景下还是比较有用的。只是在使用的时候会有些下坑&#xff0c;大家要注意下。   官网提供的信息比较简介。我们在引入到项目中使用的时候可以能会出现下面的错误提示。 Unknown custom element: <el-calendar> - did you …