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

抽象工厂模式(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)系统提供一个产品类的库,所有的产品以同样的接口实现。

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

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

相关文章

php中的错误和异常捕获

目录 一&#xff1a; 异常&#xff08;Exceptions&#xff09; 二&#xff1a; 错误&#xff08;Errors&#xff09; 三&#xff1a;实际项目的异常和错误处理 在PHP中&#xff0c;异常&#xff08;Exceptions&#xff09;和错误&#xff08;Errors&#xff09;是两个不同的…

vuex的store应用

1.在pakage.json加一行 2.和main同级别加一个js文件 import Vue from vue import Vuex from vuexVue.use(Vuex)export default new Vuex.Store({state: {langFlag: new Date().getTime()},mutations: {setLangFlag(state) {state.langFlag new Date().getTime()}} })3.在mai…

NewStarCTF2024-Week2-Misc-WP

目录 1、wireshark_checkin 2、wireshark_secret 3、字里行间的秘密 4、你也玩原神吗 5、Hertas Study 6、用溯流仪见证伏特台风 7、热心助人的小明 1、wireshark_checkin 直接字符串搜 flag flag{ez_traffic_analyze_isnt_it} 2、wireshark_secret 查看原始数据 导出十…

「C/C++」C++ STL容器库 之 std::map 键值对的集合容器

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

鸿蒙网络编程系列25-TCP回声服务器的实现

1. TCP回声服务器实现可行性 在前文鸿蒙网络编程系列2-UDP回声服务器的实现中&#xff0c;介绍了什么是回声服务器&#xff0c;并且基于UDP协议实现了一个简单的回声服务器&#xff0c;本节将基于TCP协议实现一个类似的回声服务器。在鸿蒙API10以后&#xff0c;提供了TCPSocke…

【C++】使用vscode进行 C/C++ 开发,内含c_cpp_properties.json、launch.json 和 tasks.json解释

在 Visual Studio Code (VSCode) 中进行 C/C 开发时&#xff0c;这三个 .json 文件&#xff08;c_cpp_properties.json、launch.json 和 tasks.json&#xff09;分别用于配置编译、调试和代码提示等功能。它们是 VSCode 配置环境的一部分&#xff0c;由 C/C 扩展生成&#xff0…

将java项目jar包打包成exe服务

1.结构展示 2.注意事项 前提: 环境准备:jdk8 和 .net支持 { 1.控制面板》程序和功能》启用和关闭windows功能》.net的勾选》2.jdk8自行百度安装环境3.其他项目必须的软件环境安装等&#xff08;数据库...&#xff09; }第一次准备: 1.将打包好的jar包放到premiumServices.exe…

智和信通助力某大型服饰集团建设综合监控运维

某大型服饰集团成立于90年代&#xff0c;是广受认可的国民生活时尚品牌&#xff0c;近年来随着集团公司业务规模的不断扩大&#xff0c;信息化作为支撑集团公司业务发展的重要技术手段&#xff0c;信息系统无论在规模上还是在复杂程度上均有了很大程度的增加。 项目现状 当前信…

计算机网络—vlan(虚拟局域网)

内容补充 冲突域 如果两台设备同时发送数据&#xff0c;他们的数据会互相干扰&#xff0c;那么他们就处于同一冲突域&#xff0c;例如集线器&#xff08;总线型&#xff0c;所有设备共享带宽&#xff09;的所有端口都处于冲突域。 广播域 如果一台设备发送数据&#xff0c;…

babylonjs shader学习之copy shadertoy案例

shadertoy案例&#xff1a; 准备 const onSceneReady (scene: Scene) > {const light new HemisphericLight(light, new Vector3(0, 1, 0), scene);light.intensity 0.7;Effect.ShadersStore[planeMatVertexShader] precision highp float;attribute vec3 position;attr…

单片机输出方波

从P1.0上输出一个方波,高电平5ms&#xff0c;低电平10ms. &#xff03;include〈reg51。h〉 unsigned char flag; sbit outP1^0&#xff1b; void main() &#xff5b; flag0&#xff1b; TMOD0X02; TH06&#xff1b; TL06; TR01&#xff1b; EA1&#xff1b; ET0…

Redis JSON介绍和命令大全

Redis JSON介绍和命令大全 Redis JSON先说说JSON是什么再说说JSON Path先推荐两个网站JSONPath JAVA clents Redis JSON 安装内存json命令语法命令url命令解释JSON.ARRAPPENDJSON.ARRINDEXJSON.ARRINSERTJSON.ARRLENJSON.ARRPOPJSON.ARRTRIMJSON.CLEARJSON.DEBUG MEMORYJSON.DE…

centOS部署Jenkins实现项目可持续自动化部署

个人看的是尚硅谷的视频&#xff0c;跟着实战&#xff0c;但因为视频是21年的&#xff0c;所以很容易出现jenkins插件不适配问题。 因而个人直接用较新版的jdk和jenkins. 先切换到root用户 sudo su一、安装jdk 先查询可安装版本 yum list java*安装jdk&#xff08;只复制圈…

【算法】归并排序概念及例题运用

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

爬虫日常实战

爬取美团新闻信息&#xff0c;此处采用两种方法实现&#xff1a; 注意点&#xff1a;因为此处的数据都是动态数据&#xff0c;所以一定要考虑好向下滑动数据包会更新的情况&#xff0c;不然就只能读取当前页即第一页数据&#xff0c;方法一通过更新ajax数据包网址页数&#xf…

vscode 预览markdown 文件

1. 点击左边扩展 2. 搜索“Markdown Preview Enhanced” 3. 选第一个安装即可 4. 重启vscode 5. 打开一个markdown 文件 6. 点击右上角的预览按钮

[mysql]mysql的全部单行函数

单行函数 几乎我们认识的语言都会对一些常用的功能进行,封装,有些叫函数,有些叫方法(Java),后期我们还可以自定义函数. 现在我们就当大家是没有语言基础,我们来从头开始讲.不过大家肯定接触过,中学说的函数,yf(x)f代表的就是function的缩写,这里其y2x1fx代表的就是封装的内容…

FileLink内外网文件交换——致力企业高效安全文件共享

随着数字化转型的推进&#xff0c;企业之间的文件交流需求日益增加。然而&#xff0c;传统的文件传输方式往往无法满足速度和安全性的双重要求。FileLink作为一款专注于跨网文件交换的工具&#xff0c;致力于为企业提供高效、安全的文件共享解决方案。 应用场景一&#xff1a;项…

C++大沥2019年真题——数字圈

Hi&#xff01;大家好&#xff01;Im#张亿&#xff0c;今天来讲C大沥2019年真题——数字圈 题目描述 当我们写数字时会发现有些数字有封闭区域&#xff0c;有的数字没有封闭区域。 数字 0 有一个封闭区域&#xff0c;数字 1、2、 3 都没有封闭区域&#xff0c;数字 4 有一个封…

word中的内容旋转90度

在vsto、Aspose.Words 中&#xff0c;默认没有直接的 API 可以让表格整体旋转 90 度。然而&#xff0c;我们可以通过一些方式来实现类似的效果&#xff0c;具体思路如下&#xff1a; 将表格插入到一个形状&#xff08;Shape&#xff09;或文本框中&#xff0c;然后旋转该形状。…