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

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

抽象工厂模式
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.适用场景

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

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

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

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

相关文章:

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

抽象工厂模式 1&#xff09;问题 工厂方法模式中的每个工厂只生产一类产品&#xff0c;会导致系统中存在大量的工厂类&#xff0c;增加系统的开销。 2&#xff09;概述 a&#xff09;产品族 和 产品等级结构 产品等级结构&#xff1a;产品的继承结构&#xff1b; 产品族&…...

【毕设级项目】基于ESP8266的家庭灯光与火情智能监测系统——文末源码及PPT

目录 系统介绍 硬件配置 硬件连接图 系统分析与总体设计 系统硬件设计 ESP8266 WIFI开发板 人体红外传感器模块 光敏电阻传感器模块 火焰传感器模块 可燃气体传感器模块 温湿度传感器模块 OLED显示屏模块 系统软件设计 温湿度检测模块 报警模块 OLED显示模块 …...

UnityShader(十九) AlphaBlend

上代码&#xff1a; Shader "Shader入门/透明度效果/AlphaBlendShader" {Properties{_MainTex ("Texture", 2D) "white" {}_AlphaScale("AlphaScale",Range(0,1))1.0}SubShader{Tags { "RenderType""Transparent&quo…...

3D Tiles语义分割流水线

Dylan Chua 和 Anne Lee 开发了一个处理管线&#xff0c;用于对 3D Tiles 中包含的 GL 传输格式 (glTF) 模型进行语义分割。 该管道读取并遍历 3D Tileset&#xff0c;以输出包含元数据的经过转换的划分对象集。 该项目为 3D 语义分割器提供了最小可行产品&#xff0c;作为各种…...

txt、pdf等文件转为一行一行的doccano数据集输入格式

文章目录 doccano 数据集导入简介代码实现代码运行结果代码公开 doccano 数据集导入 在Doccano 导入数据集时&#xff0c;使用TextLine的文件格式&#xff0c;导入的文件需要为一行一行文本的数据格式&#xff0c;每一行文本在导入Doccano后就是一条数据。 简介 主要工作说明…...

java Flink(四十二)Flink的序列化以及TypeInformation介绍(源码分析)

Flink的TypeInformation以及序列化 TypeInformation主要作用是为了在 Flink系统内有效地对数据结构类型进行管理&#xff0c;能够在分布式计算过程中对数据的类型进行管理和推断。同时基于对数据的类型信息管理&#xff0c;Flink内部对数据存储也进行了相应的性能优化。 Flin…...

社科赛斯考研:二十二载岁月铸辉煌,穿越周期的生命力之源

在考研培训行业的浩瀚海洋中&#xff0c;社科赛斯考研犹如一艘稳健的巨轮&#xff0c;历经二十二载风礼&#xff0c;依然破浪前行。在考研市场竞争白热化与学生对于考研机构要求越来越高的双重影响下&#xff0c;社科赛斯考研却以一种分蘖成长的姿态&#xff0c;扎根、壮大&…...

【视频图像取证篇】模糊图像增强技术之锐化类滤波场景应用小结

【视频图像取证篇】模糊图像增强技术之锐化类滤波场景应用小结 模糊图像增强技术之锐化类滤波场景应用小结—【蘇小沐】 &#xff08;一&#xff09;锐化类滤波器 模糊消除类滤波器&#xff08;Remove blur / Unsharpness&#xff09;。 通用去模糊滤波器&#xff1a;针对大…...

win10 禁止谷歌浏览器自动更新(操作贼简单)

禁止谷歌浏览器自动更新 &#xff08;1&#xff09;修改 "C:\Windows\System32\drivers\etc\hosts 文件&#xff0c;在最后增加 127.0.0.1 update.googleapis.com&#xff08;2&#xff09;保存后&#xff0c;winr 快捷键&#xff0c;输入cmd &#xff0c;打开命令行 &am…...

LeetCode每日一题【24. 两两交换链表中的节点】

思路&#xff1a;先创建虚拟头结点&#xff0c;再用双指针&#xff0c;两两交换 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr…...

jeecg启动Sentinel 一直是空白页面 解决办法用 外部 Sentinel SpringCloud之Sentinel概述和安装及简单整合

jeecg启动Sentinel 一直是空白页面 解决办法用 外部 Sentinel SpringCloud之Sentinel概述和安装及简单整合 文章目录 jeecg启动Sentinel 一直是空白页面 解决办法用 外部 Sentinel SpringCloud之Sentinel概述和安装及简单整合 Sentinel概述基本介绍 Sentinel安装下载地址: http…...

易基因:人类大脑的单细胞DNA甲基化和3D基因组结构|Science

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 高通通量表观基因组分析技术可用于阐明大脑中细胞复杂性的基因调控程序。5-甲基胞嘧啶 (5mCs)是哺乳动物基因组中最常见的修饰碱基&#xff0c;大多数5mCs发生在胞嘧啶-鸟嘌呤二核苷酸&a…...

Nginx中设置反向代理

在Nginx中设置反向代理&#xff0c;你需要使用proxy_pass指令。以下是一个简单的配置示例&#xff0c;它将Nginx配置为反向代理&#xff0c;将进入的流量转发到在本地运行的Web服务器上。 nginx http { server { listen 80; location / {proxy_pass http://localhost:8080;pro…...

无线局域网——wlan

目录 一.wlan的含义和发展 二.wlan技术带来的挑战 1.企业办公场景多样 2.位置速度的要求 3.安全的要求 4.规范的挑战 三.家庭和企业不同的部署需求 1.胖AP模式组网 2.AC瘦AP模式组网 3.组网模式的不同 四.三层隧道转发实验 1.拓扑 2.AP上线 核心交换机vlan ​编辑…...

ASP.NET 服务器控件

目录 一、使用的软件 1、下载 2、新建文件&#xff08;写一个简单的web网页&#xff09; 二、相关知识点 1、Web窗体网页的组件 &#xff08;1&#xff09;可视化组件 &#xff08;2&#xff09;用户接口逻辑 2、Web Form网页的代码模型 &#xff08;1&#xff09;单文件…...

[数据集][目标检测]麻雀检测数据集VOC+YOLO格式1157张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1157 标注数量(xml文件个数)&#xff1a;1157 标注数量(txt文件个数)&#xff1a;1157 标注…...

嵌入式学习第二十九天!(数据结构的概念、单向链表)

数据结构&#xff1a; 1. 定义&#xff1a; 一组用来保存一种或者多种特定关系的数据的集合&#xff08;组织和存储数据&#xff09; 1. 程序设计&#xff1a; 将现实中大量而复杂的问题以特定的数据类型和特定的数据结构存储在内存中&#xff0c;并在此基础上实现某个特定的功…...

【ZooKeeper】2、安装

本文基于 Apache ZooKeeper Release 3.7.0 版本书写 作于 2022年3月6日 14:22:11 转载请声明 下载zookeeper安装包 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz解压 tar -zxvf apache-zookeeper-3.7.0-b…...

通过Pytest 多数据库连接实例了解Python工厂模式与单例模式的区别

1. 前言 在做自动化测试时&#xff0c;有些特殊项目需要连接不同的数据库进行造数或者断言。自动化框架中&#xff0c;一般使用Pytest yaml 数据驱动的居多&#xff0c;如果一个项目中有上百条数据库相关测试用例&#xff0c;在数据库测试时&#xff0c;如果设计不合理的连接模…...

超拟人语音合成上线,打造有温度的交互新体验

语言使得人类可以构建共同想象的现实&#xff0c;即共同的信念&#xff0c;从而进行大规模团结合作&#xff0c;这是认知革命赋予人类力量的核心。在《人类简史》中&#xff0c;语言被描述成为人类进化的关键力量&#xff0c;而语音的能力是推动语言逐渐进化的火花。 人工智能…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...