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

C# 抽象工厂模式

栏目总目录


概念

抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在抽象工厂模式中,一个抽象的工厂类负责定义创建产品对象的接口,但是具体工厂类将负责创建具体的产品对象。这样,客户端在不直接依赖具体产品类的情况下,可以通过工厂类创建出所需的产品对象,从而实现了解耦。

角色

在抽象工厂模式中,主要包含以下几个角色:

  1. 抽象工厂(Abstract Factory):声明一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。
  2. 具体工厂(Concrete Factory):实现抽象工厂接口,具体创建一系列相关或相互依赖的对象。
  3. 抽象产品(Abstract Product):为每种产品声明接口,这些接口与产品的角色相对应。
  4. 具体产品(Concrete Product):实现了抽象产品接口的具体类,通常是在具体工厂中创建的。

好处

  1. 解耦:抽象工厂模式将产品的创建与使用分离,客户端通过抽象工厂接口与具体工厂类交互,从而隔离了具体产品的创建逻辑。
  2. 易于扩展:当需要增加新的产品系列时,只需要增加新的具体工厂类和具体产品类,而不需要修改现有的工厂接口和产品接口,符合开闭原则。
  3. 产品族支持:抽象工厂模式能够确保客户端始终只使用同一产品族中的产品,这有助于保证产品之间的一致性和兼容性。
  4. 提高灵活性:通过配置文件等方式,可以在运行时动态地切换具体工厂类,从而灵活地创建不同的产品系列。

应用场景

  1. 系统需要独立于具体产品的创建、组合和表示时
  2. 系统需要增加新的产品系列时,并且这些产品系列之间具有共同的接口或超类。
  3. 当系统中有多于一个的产品族,而每次只使用其中某一产品族
  4. 当系统提供一个大型类库,要求系统必须独立于这些产品的创建、组合和修改时

示例代码

以下是一个详细的C#抽象工厂模式实现示例,假设我们有一个图形界面库,支持不同的用户界面(如Windows和Web)和不同类型的UI组件(如按钮和文本框):

// 抽象产品:按钮
public interface IButton
{void Display();
}// 具体产品:Windows按钮
public class WinButton : IButton
{public void Display(){Console.WriteLine("Displaying Windows Button");}
}// 具体产品:Web按钮
public class WebButton : IButton
{public void Display(){Console.WriteLine("Displaying Web Button");}
}// 抽象产品:文本框
public interface ITextBox
{void Display();
}// 具体产品:Windows文本框
public class WinTextBox : ITextBox
{public void Display(){Console.WriteLine("Displaying Windows TextBox");}
}// 具体产品:Web文本框
public class WebTextBox : ITextBox
{public void Display(){Console.WriteLine("Displaying Web TextBox");}
}// 抽象工厂:UI工厂
public interface IUIFactory
{IButton CreateButton();ITextBox CreateTextBox();
}// 具体工厂:Windows UI工厂
public class WinUIFactory : IUIFactory
{public IButton CreateButton(){return new WinButton();}public ITextBox CreateTextBox(){return new WinTextBox();}
}// 具体工厂:Web UI工厂
public class WebUIFactory : IUIFactory
{public IButton CreateButton(){return new WebButton();}public ITextBox CreateTextBox(){return new WebTextBox();}
}//客户端
class Program
{static void Main(string[] args){// 使用Windows UI工厂IUIFactory winFactory = new WinUIFactory();IButton winButton = winFactory.CreateButton();ITextBox winTextBox = winFactory.CreateTextBox();// 显示Windows UI元素winButton.Display(); // 输出:Displaying Windows ButtonwinTextBox.Display(); // 输出:Displaying Windows TextBox// 切换到Web UI工厂IUIFactory webFactory = new WebUIFactory();IButton webButton = webFactory.CreateButton();ITextBox webTextBox = webFactory.CreateTextBox();// 显示Web UI元素webButton.Display(); // 输出:Displaying Web ButtonwebTextBox.Display(); // 输出:Displaying Web TextBox// 注意:这里假设了Display方法在每个UI元素上都有定义,// 并且这些方法会输出相应的字符串到控制台或某种日志系统。// 在实际的应用程序中,这些UI元素的显示可能涉及更复杂的UI框架或图形库。}
}

总结

抽象工厂模式是一种强大的设计模式,它提供了创建一系列相关或相互依赖对象的接口,使得客户端能够在不指定具体类的情况下创建这些对象。通过封装产品对象的创建细节,抽象工厂模式降低了系统的耦合度,提高了系统的可扩展性和灵活性。

相关文章:

C# 抽象工厂模式

栏目总目录 概念 抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在抽象工厂模式中,一个抽象的工厂类负责定义创建产品对象的接口,但是具体工厂类将负责创建具体的产…...

java中 两个不同类对象list,属性一样,如何copy

如果您有两个不同的类,但它们拥有相同的属性,并且您想要从一个类的列表复制到另一个类的列表,您可以使用以下方法: 使用循环: 您可以遍历原始列表,并为每个元素创建目标类的新实例。 使用 Stream API&…...

文件上传总结

一、原理 通过界面上的上传功能上传了一个可执行的脚本文件,而WEB端的系统并未对其进行检测或者检测的逻辑做的不够好,使得恶意用户可以通过文件中上传的一句话木马获得操控权 二、绕过方法 1>前端绕过 1.删除前端校验函数 checkFile() 2.禁用js…...

网页突然被恶意跳转或无法打开?DNS污染怎么解决?

前言 在网上冲浪时,我们时常会遭遇DNS污染这一区域性攻击,几乎无人能幸免。受影响时:尝试访问正规网站可能会被错误导向赌博、色情或其他恶意站点。 1.我们为什么需要DNS 当我们想要访问一个网站时,就像拨打朋友的电话号码一样…...

Matlab进阶绘图第65期—带分组折线段的柱状图

带分组折线段的柱状图是在原始柱状图的基础上,在每组柱状图位置处分别添加折线段,以进行对比或添加额外信息。 由于Matlab中未收录带分组折线段的柱状图的绘制函数,因此需要大家自行设法解决。 本文使用自制的BarwithGroupedLine小工具进行…...

EasyMedia转码rtsp视频流flv格式,hls格式,H5页面播放flv流视频

在本文中,我们将介绍如何使用 EasyMedia 将 RTSP 视频流转码为 FLV 和 HLS 格式,并在 H5 页面上播放 FLV 流视频。EasyMedia 是一个支持多种流媒体协议的开源项目,非常适合用于这种转码和流媒体传输的场景。 前提条件 已经安装并配置好 Eas…...

FPGA实验6: 有时钟使能两位十进制计数器的设计

一、实验目的与要求 1.. 熟练掌握使用原理图设计较复杂电路; 2. 学习原理图设计中总线的表示以及使用方法。 二、实验原理 运用Quartus II 集成环境下的图形设计方法设计有时钟使能的两位十进制计数器。进行波形仿真和分析、引脚分配并下载到实验设备上进行功能…...

C# 委托函数 delegate

在C#中,委托(Delegate)是一种特殊的类型,它可以持有对方法的引用。 委托是实现事件的基础。事件本质上是多播委托,允许多个方法被触发 委托允许你将方法作为参数传递给其他方法,或者将方法作为返回值从方法…...

Vue3响应式高阶用法之`shallowReadonly()`

Vue3响应式高阶用法之shallowReadonly() 在现代前端开发中,Vue3 提供了丰富的响应式 API 来帮助开发者更高效地管理状态和数据。其中,shallowReadonly() 是一个非常有用的工具,适用于需要部分只读状态的场景。本文将详细介绍 shallowReadonl…...

Windows系统安全加固方案:快速上手系统加固指南 (下)

这里写目录标题 一、概述二、IP协议安全配置启用SYN攻击保护 三、文件权限3.1 关闭默认共享3.2 查看共享文件夹权限3.3 删除默认共享 四、服务安全4.1禁用TCP/IP 上的NetBIOS4.2 ### 禁用不必要的服务 五、安全选项5.1启动安全选项5.2禁用未登录前关机 六、其他安全配置**6.1防…...

记一次因敏感信息泄露而导致的越权+存储型XSS

1、寻找测试目标 可能各位师傅会有苦于不知道如何寻找测试目标的烦恼,这里我惯用的就是寻找可进站的思路。这个思路分为两种,一是弱口令进站测试,二是可注册进站测试。依照这个思路,我依旧是用鹰图进行了一波资产的搜集&#xff…...

Java笔试面试题AI答之线程Thread(1)

答案来自 Kimi AI 目录 1. 进程和线程的区别?2. Java语言创建线程的方式有哪些?3. Java线程有哪几种可用状态?4. Java同步方法和同步代码块的区别?5. 在监视器(Monitor)内部,如何做线程同步的?6. 什么是死…...

2.5 C#视觉程序开发实例2----图片内存管理

2.5 C#视觉程序开发实例2----图片内存管理 1 目标效果视频 mat-buffer 2 Mat 数组的定义 3 图片内存使用场合说明 3.1 程序加载或者切换程序时 3.2 设定时,注册图片 例如注册一个线速的图片 注册流程说明 3.3 外部触发时采集最新图片或者按钮点击时触发拍照 …...

Java核心 - 深入理解 Java 枚举类

作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有疑问和建议,请私信或评论留言! 前言 在Java中&…...

HOW - CSS 定义颜色值

目录 1. 十六进制颜色 (Hexadecimal Color)2. RGB 颜色 (RGB Color)3. HSL 颜色 (HSL Color)HSL 颜色模式示例 4. 预定义颜色名 (Named Colors)5. LCH 颜色 (LCH Color)6. Lab 颜色 (Lab Color)7. HWB 颜色 (HWB Color)8. CSS 颜色函数 (Color Function)9. CSS4 颜色模块中的其…...

Vue3 reactive原理(一)-代理对象及数组

Proxy 只能拦截对一个对象的基本操作(例如读取、设置属性值),而无法拦截复合操作(例如,obj.fun(),由两个基本操作组成,1)get到fun这个属性,2)函数调用)。 1 …...

基于联咏 NT98692芯片赋能边缘计算IP摄像机与XVR监控系统解决方案

联咏 NT98692 是一款新世代整合度极高的 SoC,具有高影像品质、低位元率、低功耗,针对 8Kp30 边缘运算 IP 摄影机与后端监控系统 XVR 应用。此 SoC 整合了 ARM Quad Cortex A73 CPU 核心、新一代 ISP 和 AI ISP、H.265/H.264 视讯压缩编解码器、DSP、高效…...

Python设计模式 - 工厂方法模式

定义 工厂方法模式是一种创建型设计模式,它定义一个创建对象的接口,让其子类来处理对象的创建,而不是直接实例化对象。 结构 抽象工厂(Factory):声明工厂方法,返回一个产品对象。具体工厂类都…...

学习记录:ESP32控制舵机 FREERTOS BLE

控制舵机 PWM信号 PWM信号是一种周期性变化的方波信号,它有两个关键参数: 周期(Period):一个完整的PWM信号的时间长度,通常用秒(s)或毫秒(ms)表示。占空比…...

react中的useState和Hook、副作用

react的组件分为类组件和函数组件,Hook 是一种特殊的函数,可以让你在函数组件中使用类组件中才有的一些特性。useState、useEffect、useReducer都是Hook。其中useState用于在函数组件中添加状态,useEffect用于在函数组件中执行副作用&#xf…...

京东自动评价工具:3分钟解决购物评价难题的智能助手

京东自动评价工具:3分钟解决购物评价难题的智能助手 【免费下载链接】jd_AutoComment 自动评价,仅供交流学习之用 项目地址: https://gitcode.com/gh_mirrors/jd/jd_AutoComment 还在为购物后的评价烦恼吗?每次收到京东的"待评价"提醒&…...

初创公司如何借助Taotoken控制大模型API试用与正式成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创公司如何借助Taotoken控制大模型API试用与正式成本 对于初创公司而言,在产品从原型验证到正式上线的过程中&#x…...

淘金币自动化脚本:3分钟完成淘宝全任务,每天节省20分钟

淘金币自动化脚本:3分钟完成淘宝全任务,每天节省20分钟 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojin…...

避坑指南:海康威视工业相机SDK二次开发常见问题排查(从环境配置到图像采集)

海康威视工业相机SDK开发实战:从环境搭建到图像处理的深度避坑指南 工业视觉领域的开发者们,是否曾在深夜调试海康威视相机SDK时,被突如其来的"DLL缺失"错误打断思路?或是明明按照文档配置了项目属性,却始终…...

用Python和MATLAB复现DMD算法:从COVID-19死亡数据预测到动态模态分解实战

用Python和MATLAB复现DMD算法:从COVID-19死亡数据预测到动态模态分解实战 动态模态分解(Dynamic Mode Decomposition, DMD)作为一种数据驱动的建模方法,近年来在复杂系统分析、流体力学和流行病预测等领域展现出强大潜力。本文将带…...

Taotoken用量看板与成本管理功能的实际使用体验

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken用量看板与成本管理功能的实际使用体验 对于需要持续调用大模型API的项目而言,成本的可观测与可控性是管理中的…...

TinyRedis随笔

在TinyRedis的内存与AOF之间的关系中,AOF接入点在命令层中,因为只有在执行写命令,修改DB内存之后,再对AOF文件进行写入。但是这里也存在一个问题,如果对aof文件写入失败了呢,那就会造成内存与aof文件数据不…...

Cursor Pro 终极破解指南:如何永久免费使用AI编程神器

Cursor Pro 终极破解指南:如何永久免费使用AI编程神器 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tri…...

Claude AI代码扩展工具:在IDE中无缝集成智能编程助手

1. 项目概述:一个为Claude AI设计的代码扩展工具最近在折腾AI编程助手的时候,发现了一个挺有意思的项目——dliedke/ClaudeCodeExtension。这玩意儿说白了,就是一个专门为Claude(就是Anthropic家那个AI)设计的代码扩展…...

自然语言编写嵌入式软件之点亮LED灯

要实现的功能: 控制LED以10HZ的频率闪烁 传统实现过程:学C语言,看数据手册了解MCU,学教程,copy代码,学编译调试环境,学仿真,学用仪器测量 自然语言编程实现过程: 搭建…...