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

软件设计模式------抽象工厂模式

抽象工厂模式(Abstract Factory Pattern),又称Kit模式,属于对象创建型模式。

一:先理解两个概念:

(1)产品等级结构:

         即产品的继承结构。

        @通俗来讲,就是不同品牌的同种具体电器

如一个抽象类是电视机类,其子类有海尔电视机、海信电视机、TCL电视机等等,则抽象电视机与具体产品电视机之间构成了一个产品等级结构。

(2)产品族:

        在抽象工厂模式里,产品族是指同一个工厂生产的,位于不同产品等级结构的一组产品。

        @通俗来讲,就是相同品牌旗下的不同电器产品

如海尔电器工厂生产的的是海尔电视机、海尔空调、海尔冰箱等,其中,海尔电视机位于电视机产品等级结构中,海尔空调位于空调产品等级结构中......

二、模式动机:

        当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。

        在工厂方法模式中,多个具体工厂有相同的父类接口,每一个具体工厂对应一种具体产品,但有时候我们需要一个具体工厂可以对应多个产品对象,例如:生产电器的海尔工厂,不会只生产海尔牌电视机,它可能还会想要生产海尔牌冰箱,海尔牌空调,海尔牌电饭煲等。

        通俗来讲,就是一个工厂有时并不满足于只生产某种品牌的一种具体产品(工厂方法模式),还想着生产该品牌旗下的其它不同的具体产品(@抽象方法模式)。

三、定义:

        提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

四、模式结构:

1.AbstractFactory(抽象工厂)

         用于声明抽象产品的方法,在一个抽象工厂中可以定义一组方法,每一个方法对应一个产品等级结构。

2.ConcreteFactory(具体工厂)

        具体工厂实现了抽象工厂声明的生成抽象产品的方法,生成一组具体产品,这些产品构成了一系列产品族,每一个产品都位于某个产品结构中,

3.AbstractProduct(抽象产品)

        为每种产品声明接口,在抽象产品中定义了产品抽象业务方法。

4.ConcreteProduct(具体产品)

        具体产品定义具体工厂生产的具体产品对象,实现抽象产品接口中定义的业务方法。

五、模式分析:

六、模式实例与解析:

1.实例说明

        某系统为了改进数据库的性能,用户可以自定义数据库连接对象Connection和语句对象Statement,针对不同的数据库提供不同的连接对象和语句对象,例如提供Oracle或MySQL专用连接类和语句类,而且用户可以通过配置文件等方式根据实际需求动态更换系统数据库。使用抽象工厂模式设计该系统,绘制对应的类图并编程模拟实现。

2.实例类图

3.实例代码
(产品区Products包下的类)

(工厂区Factories包下的类)

(1)AbstractFactory类:

package Factories;import Products.ConnectionClass;
import Products.StatementClass;public interface AbstractFactory {public ConnectionClass createConnection();public StatementClass createStatement();
}

(2)MySQLFactory(ConcreteFactory):

package Factories;import Products.ConnectionClass;
import Products.MConnection;
import Products.MStatement;
import Products.StatementClass;public class MySQLFactory implements AbstractFactory{@Overridepublic ConnectionClass createConnection() {return new MConnection();}@Overridepublic StatementClass createStatement() {return new MStatement();}
}

(3)OracleFactory(ConcreteFactory):

package Factories;import Products.ConnectionClass;
import Products.OConnection;
import Products.OStatement;
import Products.StatementClass;public class OracleFactory implements AbstractFactory{@Overridepublic ConnectionClass createConnection() {return new OConnection();}@Overridepublic StatementClass createStatement() {return new OStatement();}
}
4.辅助代码
(1)Client类
package Clients;import Factories.AbstractFactory;
import Products.ConnectionClass;
import Products.StatementClass;public class Client {public static void main(String[] args) {AbstractFactory factory = (AbstractFactory) XMLUtil.getBean();ConnectionClass connectionClass = factory.createConnection();connectionClass.connectionPlay();StatementClass statementClass = factory.createStatement();statementClass.statementPlay();}
}
(2)XMLUtiil类
package Clients;import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil
{//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象public static Object getBean(){try{//创建文档对象DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dFactory.newDocumentBuilder();Document doc;doc = builder.parse(new File("config.xml"));//获取包含类名的文本节点NodeList nl = doc.getElementsByTagName("className");Node classNode=nl.item(0).getFirstChild();String cName=classNode.getNodeValue();//通过类名生成实例对象并将其返回Class c=Class.forName(cName);Object obj=c.newInstance();return obj;}catch(Exception e){e.printStackTrace();return null;}}
}
(3)配置文件config.xml
<?xml version="1.0"?>
<config><className>Factories.MySQLFactory</className>
</config>
5.实例结果

如果将配置文件config.xml中<className>里的内容改为Factories.OracleFactory,则运行如下:

6.实例分析

        如果要增加一种新的数据库,及增加一个新的产品族,如增加DB2的连接对象和DB2的语句对象,则只需增加一个具体工厂(DB2Factory)即可,再将配置文件config.xml中具体工厂类类名改为新增的工厂类类名(DB2Factory),原有其他代码无需修改。

        但是如果要新增加一种新的对象,例如新增加一种管理对象,则原有代码库需要做出较大的修改,将导致系统不再符合“开闭原则”。

        故,抽象工厂模式对“开闭原则”的支持具有特殊性。

七、模式的优点:

1、抽象工厂模式隔离了具体类的生成,使得用户并不需要知道什么被创建。

2、当一个产品族中的多个对象被设计成一起工作时,它能够确保客户端始终只使用同一个产品族中的对象。

3、增加新的具体工厂和产品族很方便,无需修改已有系统,符合“开闭原则”。

八、模式的缺点:

        在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品。

九、模式适用环境:

(1)用户无需关心对象的创建过程,将对象的创建和使用解耦。

(2)系统中有多于一个的产品族,而每次只使用其中某一产品族。

(3)属于同一产品族的产品将在一起使用。

(4)系统提供一个产品类的库,所有的产品以同样的接口实现。

相关文章:

软件设计模式------抽象工厂模式

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;&#xff0c;又称Kit模式&#xff0c;属于对象创建型模式。 一&#xff1a;先理解两个概念&#xff1a; &#xff08;1&#xff09;产品等级结构&#xff1a; 即产品的继承结构。 通俗来讲&#xff0c;就是不同品…...

基于springboot+微信小程序校园自助打印管理系统(打印1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于springboot微信小程序校园自助打印管理系统实现了管理员、店长和用户。管理员实现了用户管理、店长管理、打印店管理、打印服务管理、服务类型管理、预约打印管理和系统管理。店长实现…...

解锁文本数据可视化的无限可能:Wordcloud库全解析

文章目录 **&#x1f31f;解锁文本数据可视化的无限可能&#xff1a;Wordcloud库全解析&#x1f510;**1. **背景介绍**2. **Wordcloud库是什么&#xff1f;**3. **如何安装Wordcloud库&#xff1f;**4. **Wordcloud库的基本函数使用方法**5. **实际应用场景**6. **常见问题及解…...

代码审计-Python Flask

1.Jinjia2模版注入 Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug &#xff0c;模板引擎则使用 Jinja2。jinja2是Flask作者开发的一个模板系统&#xff0c;起初是仿django模板的一个模板引擎&#xff0c;为Flask提供模板支持&#xff0c;由于…...

深度学习:开启人工智能的新纪元

深度学习&#xff1a;开启人工智能的新纪元 深度学习是机器学习的一个子领域&#xff0c;它基于人工神经网络的学习算法&#xff0c;特别是那些具有多个非线性变换的层&#xff08;即“深度”&#xff09;。这些算法模仿人脑处理信息的方式&#xff0c;通过学习数据的多层次表…...

第十四章_File类与IO流

目录 1. java.io.File类的使用 1.1 概述 1.2 构造器 1.3 常用方法 1、获取文件和目录基本信息 2、列出目录的下一级 3、File类的重命名功能 4、判断功能的方法 5、创建、删除功能 1.4 练习 2. IO流原理及流的分类 2.1 Java IO原理 2.2 流的分类 2.3 流的API 3. …...

Qml-CheckBox的使用

Qml-CheckBox的使用 CheckBox属性 CheckBox的继承关系&#xff1a; CheckBox – AbstractButton – Control – Item; CheckBox的属性主要继承于AbstractButton。属性checkState&#xff1a;勾选状态&#xff0c;值为&#xff1a;Qt.Unchecked、Qt.Checked、Qt.PartiallyChec…...

Java的RocketMQ使用

在 Spring Boot 中&#xff0c;RocketMQ 和 Kafka 都是常用的消息中间件&#xff0c;它们的使用方法有一些相似之处&#xff0c;也有各自的特点。 一、RocketMQ 在 Spring Boot 中的使用 引入依赖 在项目的pom.xml文件中添加 RocketMQ 的依赖。 <dependency><groupId…...

中间件之MQ-Kafka

一、引言 Apache Kafka是一个分布式消息队列系统&#xff0c;最初由LinkedIn开发&#xff0c;并于2011年开源。Kafka以其高吞吐量、低延迟和容错能力而著名&#xff0c;广泛应用于日志收集、实时流处理、事件驱动架构等领域。本文将详细介绍Kafka的基本概念、特点、应用场景以…...

[DB] NSM

Database Workloads&#xff08;数据库工作负载&#xff09; 数据库工作负载指的是数据库在执行不同类型任务时所需的资源和计算方式&#xff0c;主要包括以下几种类型&#xff1a; 1. On-Line Transaction Processing (OLTP) 中文&#xff1a;联机事务处理解释&#xff1a;…...

Redis 高可用:从主从到集群的全面解析

目录 一、主从复制 (基础)1. 同步复制a. 全量数据同步b. 增量数据同步c. 可能带来的数据不一致 2. 环形缓冲区a. 动态调整槽位 3. runid4. 主从复制解决单点故障a. 单点故障b. 可用性问题 5. 注意事项a. Replica 主动向 Master 建立连接b. Replica 主动向 Master 拉取数据 二、…...

全能型选手视频播放器VLC 3.0.21 for Windows 64 bits支持Windows、Mac OS等供大家学习参考

全能型选手视频播放器&#xff0c;支持Windows、Mac OS、Linux、Android、iOS等系统&#xff0c;也支持播放几乎所有主流视频格式。 推荐指数&#xff1a; ★★★★★ 优点&#xff1a; ◆、界面干净简洁&#xff0c;播放流畅 ◆、支持打开绝大多数的文件格式&#xff0c;包…...

解决在Vue3中使用monaco-editor创建多个实例的导致页面卡死的问题

最近在项目中使用到了monaco-editor来实现相关的业务功能&#xff0c;按照官方使用方法进行了相关操作&#xff0c;但是在使用的时候&#xff0c;总是会导致创建多个编辑器实例&#xff0c;导致页面卡死的情况&#xff0c;下面来看看怎么处理这种情况吧&#xff0c;先说一下我使…...

【某农业大学计算机网络实验报告】实验二 交换机的自学习算法

实验目的&#xff1a; &#xff08;1&#xff09;理解交换机通过逆向自学习算法建立地址转发表的过程。 &#xff08;2&#xff09;理解交换机转发数据帧的规则。 &#xff08;3&#xff09;理解交换机的工作原理。 实验器材&#xff1a; 一台Windows操作系统的PC机。 实…...

燕山大学23级经济管理学院 10.18 C语言作业

燕山大学23级经济管理学院 10.18 C语言作业 文章目录 燕山大学23级经济管理学院 10.18 C语言作业1C语言的基本数据类型主要包括以下几种&#xff1a;为什么设计数据类型&#xff1f;数据类型与知识体系的对应使用数据类型时需要考虑的因素 21. 逻辑运算符2. 真值表3. 硬件实现4…...

【880线代】线性代数一刷错题整理

第一章 行列式 2024.8.20日 1. 2. 3. 第二章 矩阵 2024.8.23日 1. 2024.8.26日 1. 2. 3. 4. 5. 2024.8.28日 1. 2. 3. 4. 第四章 线性方程组 2024.9.13日 1. 2. 3. 4. 5. 2024.9.14日 1. 第五章 相似矩阵 2024.9.14日 1. 2024.9.15日 1. 2. 3. 4. 5. 6. 7. 2024.9.…...

【C++语言】精妙的哈希算法:原理、实现与优化

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 哈希算法是计算机科学中的一项基本技术,广泛应用于数据检索、加密、缓存等领域。本文将深入探讨C++中的哈希算法,详细讲解其原理、实现、优化以及在不同应用场景中的使用。通过丰富的代码示例和数学推导,本文旨…...

基于STM32的手势电视机遥控器设计

引言 本项目设计了一个基于STM32的手势电视机遥控器&#xff0c;利用红外线传输和加速度传感器&#xff08;或陀螺仪&#xff09;检测用户的手势动作&#xff0c;用于控制电视的音量、频道切换等操作。通过对手势的实时检测和分类&#xff0c;系统能够识别左右、上下、旋转等手…...

2、图像的特征

一、角点检测-Harris 1、cv2.cornerHarris角点检测函数 在 cv2.cornerHarris 函数中&#xff0c;Sobel 算子用于计算图像的梯度&#xff0c;这是 Harris 角点检测的第一步。 cv2.cornerHarris(src, blockSize, ksize, k, dstNone, borderTypeNone)下面是各个参数的详细解释&…...

URL、URN和URI的区别

目录 一&#xff1a;URI二&#xff1a;URN三&#xff1a;URL1. URL格式 一&#xff1a;URI URI 是&#xff08;Uniform Resource Identifier&#xff09;统一资源标识符的缩写。用于唯一标识互联网上的资源。URI包含了URN和URL 二&#xff1a;URN URN是&#xff08;Uniform …...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

爬虫基础学习day2

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

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...