设计模式之抽象工厂模式解析

抽象工厂模式
1)问题

工厂方法模式中的每个工厂只生产一类产品,会导致系统中存在大量的工厂类,增加系统的开销。

2)概述
a)产品族 和 产品等级结构

产品等级结构:产品的继承结构;

产品族:由同一个工厂生产,位于不同产品等级结构中的一组产品;

在这里插入图片描述

b)适用场景

当系统所提供的工厂,生产的是多个位于不同产品等级结构、属于不同类型的具体产品时,可以使用抽象工厂模式。

工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构。

在这里插入图片描述

每个具体工厂可以生产属于一个产品族的所有产品,例如生产颜色相同的正方形、圆形和椭圆形,所生产的产品又位于不同的产品等级结构中。

如果使用工厂方法模式,需要提供15个具体工厂,而使用抽象工厂模式只需要提供5个具体工厂,极大减少了系统中类的个数。

c)定义

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

在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品,这些产品构成了一个产品族;

在这里插入图片描述

3)角色

AbstractFactory(抽象工厂):声明了一组用于创建一族产品的方法,每一个方法对应一种产品。

ConcreteFactory(具体工厂):实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。

AbstractProduct(抽象产品):为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。

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

abstract class AbstractFactory {public abstract AbstractProductA createProductA(); //工厂方法一public abstract AbstractProductB createProductB(); //工厂方法二……
}class ConcreteFactory1 extends AbstractFactory {//工厂方法一public AbstractProductA createProductA() {return new ConcreteProductA1();}//工厂方法二public AbstractProductB createProductB() {return new ConcreteProductB1();}……
}

与工厂方法模式一样,抽象工厂模式也可为每一种产品提供一组重载的工厂方法,以不同的方式对产品对象进行创建。

4)案例-初始方案

在这里插入图片描述

问题

增加新皮肤时,需要增加大量类,每个新增具体组件都需要增加一个具体工厂,类的个数成对增加,影响系统维护成本和运行开销;

每个组件都需要一个具体工厂,在使用时要逐个设置,在客户端代码和配置文件都较为复杂。

5)案例-重构后

在这里插入图片描述

//按钮接口:抽象产品
interface Button {public void display();
}//Spring按钮类:具体产品
class SpringButton implements Button {public void display() {System.out.println("显示浅绿色按钮。");}
}//Summer按钮类:具体产品
class SummerButton implements Button {public void display() {System.out.println("显示浅蓝色按钮。");}	
}//文本框接口:抽象产品
interface TextField {public void display();
}//Spring文本框类:具体产品
class SpringTextField implements TextField {public void display() {System.out.println("显示绿色边框文本框。");}
}//Summer文本框类:具体产品
class SummerTextField implements TextField {public void display() {System.out.println("显示蓝色边框文本框。");}	
}//组合框接口:抽象产品
interface ComboBox {public void display();
}//Spring组合框类:具体产品
class SpringComboBox implements ComboBox {public void display() {System.out.println("显示绿色边框组合框。");}
}//Summer组合框类:具体产品
class SummerComboBox implements ComboBox {public void display() {System.out.println("显示蓝色边框组合框。");}	
}//界面皮肤工厂接口:抽象工厂
interface SkinFactory {public Button createButton();public TextField createTextField();public ComboBox createComboBox();
}//Spring皮肤工厂:具体工厂
class SpringSkinFactory implements SkinFactory {public Button createButton() {return new SpringButton();}public TextField createTextField() {return new SpringTextField();}public ComboBox createComboBox() {return new SpringComboBox();}
}//Summer皮肤工厂:具体工厂
class SummerSkinFactory implements SkinFactory {public Button createButton() {return new SummerButton();}public TextField createTextField() {return new SummerTextField();}public ComboBox createComboBox() {return new SummerComboBox();}
}

配置文件 config.xml 中存储了具体工厂类的类名

<?xml version="1.0"?>
<config><className>SpringSkinFactory</className>
</config>

客户端代码

class Client {public static void main(String args[]) {//使用抽象层定义SkinFactory factory;Button bt;TextField tf;ComboBox cb;factory = (SkinFactory)XMLUtil.getBean();bt = factory.createButton();tf = factory.createTextField();cb = factory.createComboBox();bt.display();tf.display();cb.display();}
}

如果需要增加新的皮肤,只需增加一族新的具体组件并提供一个新的具体工厂,修改配置文件即可使用新的皮肤,原有代码无须修改

6)开闭原则的倾斜性

在抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构很麻烦。

增加产品族:只需要增加具体产品并对应增加一个新的具体工厂,对已有代码无须做任何修改。

增加新的产品等级结构:需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品的方法。

7)总结

1.优点

增加新的产品族很方便,无须修改已有系统。

2.缺点

增加新的产品等级结构需要对原有系统进行较大修改,需要修改抽象层代码。

3.适用场景

用户无须关心对象的创建过程,将对象的创建和使用解耦。

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

属于同一个产品族的产品将在一起使用。

产品等级结构稳定,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。

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

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

相关文章

通俗理解自注意力机制

自注意力机制&#xff08;Self-Attention Mechanism&#xff09; 是一种用于处理序列数据的机制&#xff0c;最初被引入到神经网络模型中&#xff0c;用于在序列数据中建立全局依赖关系。自注意力机制最常用于自然语言处理和计算机视觉领域&#xff0c;特别是在Transformer模型…

【Flutter】文件选择器(file_picker)的用法

Flutter 没有提供内置的文件选择器&#xff0c;但社区内有人贡献了一个比较完整的解决方案——file_picker。 file_picker 的 API 简洁易用&#xff0c;支持全平台&#xff08;Android / iOS / Mac / Linux / Windows&#xff09;&#xff0c;是我开发桌面应用时的首选。 这边…

HMI界面之:上位机界面设计,一文扫盲

一、什么是上位机 上位机&#xff08;Supervisory Control and Data Acquisition&#xff0c;简称SCADA&#xff09;是一种用于监控和控制工业过程的计算机系统。它通常由两个主要部分组成&#xff1a;上位机和下位机。 上位机是SCADA系统中的主要控制中心&#xff0c;负责监控…

mysql笔记:24. 主从同步环境搭建

文章目录 主从同步的基本原理主从同步的搭建步骤1. 环境准备2. 配置主服务器&#xff08;Master&#xff09;3. 配置从服务器&#xff08;Slave&#xff09;4. 测试配置5. 常见故障5.1. 主从服务器上的MySQL版本不一致导致失败&#xff1f;5.2. Slave_IO_Running状态异常&#…

使用ollama + webui 运行任意大模型

安装ollama https://hub.docker.com/r/ollama/ollama docker run -d -v ~/Documents/work/softs/docker/ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama验证安装 # 进入容器docker exec -it ollama bash # 运行大模型 ollama run llama2 # 发送请求&…

三级数据库技术考点(详解!!)

1、 答疑:【解析】分布式数据库系统按不同层次提供的分布透明性有:分片透明性;②位置透明性;③局部映像透明性&#xff0c;位置透明性是指数据分片的分配位置对用户是透明的&#xff0c;用户编写程序时只需 要考虑数据分片情况&#xff0c;不需要了解各分片在各个场地的分配情…

什么是物联网远程模块

在数字化和信息化的浪潮下&#xff0c;物联网技术正在以惊人的速度改变着我们的生活和生产方式。物联网远程模块&#xff0c;作为物联网技术的核心组件之一&#xff0c;正引领着这场变革。HiWoo Box就是这样一款出色的物联网远程模块&#xff0c;它通过支持远程透传、远程锁机、…

多进程数据库不适合作为hive的元数据库

简介 “今天发现一个比较奇怪的现象&#xff0c;因为博主不熟悉mysql&#xff0c;所以在安装hive的使用了postgresql作为hive的元数据库&#xff0c;在测试几个连接工具对hive进行链接&#xff0c;后面再测试的时候发现链接不上了&#xff0c;并且报错日志如下&#xff1a;” …

从回收站删除的文件如何恢复?图文详解(3个方法)!

“各位大佬&#xff01;从回收站删除了重要的文件后&#xff0c;有什么方法可以恢复文件吗&#xff1f;快帮帮我吧&#xff01;这些被删除的文件都是比较重要的&#xff01;” 回收站作为电脑中的一个重要工具&#xff0c;当我们误删文件后&#xff0c;通过回收站有机会快速恢复…

QT增加线程函数步骤流程

在使用线程的时候&#xff0c;不仅要关注线程开启的时机&#xff0c;同时还要关注线程安全退出&#xff0c;这样才能保证程序的健壮性&#xff0c;如果线程开启的较多&#xff0c;且开启关闭比较频繁&#xff0c;建议使用线程池来处理。开启线程有三种方式&#xff1a;第一种C的…

C语言动态内存管理(重点)

目录 1、为什么要有动态内存分配 2、malloc 和 free 2.1 malloc函数 2.2 free函数 3、calloc 和 realloc 3.1 calloc函数 3.2 realloc 函数 3.3 realloc 和 malloc 区别 3.4 realloc 函数存在的问题 4、常见的动态内存的错误 5、动态内存经典笔试题分析 6、柔…

Vue.js前端开发零基础教学(一)

目录 第一章 初识Vue.js 前言 开发的好处 一.前端技术的发展 什么是单页Web应用&#xff1f; 二. Vue的简介 三. Vue的特性 四. Vue的版本 五.常见的包管理 六.安装node环境 第一章 初识Vue.js 学习目标&#xff1a; 了解前端技术的发展 了解什么是Vue掌握使用方…

Oracle19C图形界面安装教程

文章目录 一、安装前的准备1、安装Linux操作系统2、配置网络源或者本地源3、hosts文件配置 二、Oracle19c安装过程1、安装相关软件&#xff1a;2、用户与组&#xff1a;3、修改内核参数&#xff1a;4、资源限制&#xff1a;5、配置用户环境变量&#xff1a;6、创建相关文件目录…

如何理解 Linux 命令行参数与环境变量7

一、命令行参数 1.1参数介绍 在写C语言程序时&#xff0c;main函数是否可以带参数呢&#xff1f;------ 是可以的 int argc: 命令行参数的个数char *argv[ ]: 字符指针数组&#xff08;指向各个命令行参数的字符指针所构成的数组&#xff09; 我们写一段代码来打印一下看这…

基于单片机的事务管理系统

基于单片机的事务管理系统 摘 要 所谓事务管理系统就是主要用来做提醒&#xff0c;辅助以计时、秒表等的一个小系统。利用MCS51单片机即可完成系统硬件需要&#xff0c;成本低廉&#xff0c;程序简单&#xff0c;功能丰富实用&#xff0c;使用率广。根据题目的设计要求&#…

HW中常见的面试题

1.说说你在工作中或者SRC中挖到的比较典型的漏洞? 2.HW中如果已经发现红方IP地址&#xff0c;该如何溯源? 通过蜜罐系统或者安全设备锁定红方MAC&#xff0c;然后通过IP地址对&#xff0c;whois查询到该IP注册人以及注册邮箱&#xff0c;如果是发现邮箱是某厂商注册则可利…

SpringBoot-03 | SpringBoot自动配置

SpringBoot-03 | SpringBoot自动配置 原理分析代码示例源码剖析SpringBootConfiguration&#xff1a;组合注解&#xff0c;标记当前类为配置类ComponentScanEnableAutoConfigurationImport加载spring.factoriesrun初始化加载spring.factoriesspring.factories中的钩子类 网上盗…

部署DiffSynth-Studio实现视频风格转换

DiffSynth 是一个新的 Diffusion 引擎&#xff0c;可以实现图片和视频的风格转换。 拉取源码 git clone https://github.com/Artiprocher/DiffSynth-Studio/ 创建环境 conda env create -f environment.yml conda activate DiffSynthStudio 下载模型 将Stable Diffusion模…

组织学习的革命:打破常规,引领未来

组织学习的革命&#xff1a;打破常规&#xff0c;引领未来 一、组织学习的重塑&#xff1a;从传统到现代的转变 在知识经济的时代背景下&#xff0c;组织学习已经成为企业持续发展和竞争优势的关键。传统的组织学习方式&#xff0c;如培训、研讨会等&#xff0c;虽然在一定程…

NeRF——基于神经辐射场的三维场景重建和理解

概述 三维重建是一种将物理世界中的实体转换为数字模型的计算机技术。其基本概念是通过对物理世界中的物体或场景进行扫描或拍摄&#xff0c;并使用计算机算法将其转换为三维数字模型。抽象意义上的三维模型指的是&#xff1a;形状和外观的组合&#xff0c;并且可以渲染成不同…