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框架或图形库。}
}

总结

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

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

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

相关文章

RDF中IEXT和ICEXT的区别

IEXT和ICEXT是RDF语义中两个重要的概念,它们有着明显的区别: IEXT(属性扩展): IEXT代表"Extension of Properties"(属性扩展)它用于属性(properties)IEXT( p )是一个二元关…

牛客JS题(九)数组排序

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 条件排序封装渲染列表 题干&#xff1a; 我的答案 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /></head><body><button class"up…

Datawhale AI 夏令营——AI+逻辑推理——Task1

# Datawhale AI 夏令营 夏令营手册&#xff1a;从零入门 AI 逻辑推理 比赛&#xff1a;第二届世界科学智能大赛逻辑推理赛道&#xff1a;复杂推理能力评估 代码运行平台&#xff1a;魔搭社区 比赛任务 本次比赛提供基于自然语言的逻辑推理问题&#xff0c;涉及多样的场景&…

React Native 与 Flutter:你的应用该如何选择?

Flutter 和 React Native 都被认为是混合应用程序开发中的热门技术。然而&#xff0c;当谈到为你的项目使用框架时&#xff0c;你必须考虑哪一个是最好的&#xff1a;Flutter 还是 React Native&#xff1f; 本篇文章包含 Flutter 和 React Native 在各个方面的差异。因此&…

Windows 10 安装 WSL、安装 Go 以及配置环境变量的详细教程

安装 WSL 和 Ubuntu 启用 WSL 功能 以管理员身份打开 PowerShell。 运行以下命令以启用 WSL 功能&#xff1a; dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart启用虚拟机平台 继续在管理员 PowerShell 中运行以下命令以启…

正则表达式与文本处理

目录 一、正则表达式 1、正则表达式定义 1.1正则表达式的概念及作用 1.2、正则表达式的工具 1.3、正则表达式的组成 2、基础正则表达式 3、扩展正则表达式 4、元字符操作 4.1、查找特定字符 4.2、利用中括号“[]”来查找集合字符 4.3、查找行首“^”与行尾字符“$”…

【Golang 面试 - 进阶题】每日 3 题(四)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

Lesson 52 What nationality are they? Where do they come from?

Lesson 52 What nationality are they? Where do they come from? 词汇部分 the U.S. 美国 全称&#xff1a;The United States of America    美利坚合众国 其他称呼&#xff1a;the States      the U.S.A.      Uncle Sam Brazil n. 巴西 Brazilian a. 巴…

LeetCode算法——滑动窗口矩阵篇

1、长度最小的子数组 题目描述&#xff1a; 解法&#xff1a; 设一个 for 循环来改变指向窗口末尾的指针&#xff0c;再不断抛弃当前窗口内的首元素 最终确定满足条件的最小长度 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int …

duilib中设置窗口透明度的接口CPaintManagerUI::SetTransparent有问题导致使用duilib窗口实现异形窗口无效的排查

目录 1、duilib框架中设置窗口透明度的代码说明 2、UpdateLayeredWindow调用失败,发现添加的WS_EX_LAYERED风格被删除了 3、窗口有WS_EX_LAYERED风格了,但UpdateLayeredWindow调用依旧失败 4、如何知道SetLayeredWindowAttributes函数调用之后再调用UpdateLayeredWindow…

netty构建http服务器

Netty 是一个高性能的异步事件驱动的网络应用框架&#xff0c;用于快速开发可维护的高性能协议服务器和客户端。要使用 Netty 搭建一个支持 HTTP 方法&#xff08;GET, POST, PUT, DELETE&#xff09;的 HTTP 服务器&#xff0c;可以按照以下步骤进行操作。 准备工作 添加依赖…

苹果电脑暂存盘已满怎么清理 Mac系统如何清理磁盘空间 清理MacBook

Mac电脑用户在长时间使用电脑之后&#xff0c;时常会看到“暂存盘已满”的提示&#xff0c;这无疑会给后续的电脑使用带来烦恼&#xff0c;那么苹果电脑暂存盘已满怎么清理呢&#xff0c;下面将给大家带来一些干货帮你更好地解决这个问题。 首先我们要搞明白为什么暂存盘会满&…

c++ 智能指针shared_ptr与make_shared

shared_ptr是C11引入的一种智能指针&#xff0c;‌它允许多个shared_ptr实例共享同一个对象&#xff0c;‌通过引用计数来管理对象的生命周期。‌当最后一个持有对象的shared_ptr被销毁时&#xff0c;‌它会自动删除所指向的对象。‌这种智能指针主要用于解决资源管理问题&…

select count小坑

count(字段&#xff09;如果字段有NULL则不会统计进来&#xff0c;count(1)和count(*)则没有这个问题

警务平台app

智慧公安以大数据、云计算、人工智能、物联网和移动互联网技术为支撑&#xff0c;以“打、防、管、控”为目的&#xff0c;综合研判为核心&#xff0c;共享信息数据资源&#xff0c;融合业务功能&#xff0c;构建公安智慧大数据平台&#xff0c;实现公安信息数字化、网络化和智…

【运维自动化-配置平台】模型及模型关联最小化实践

蓝鲸智云配置平台&#xff0c;以下简称配置平台 我们知道主机是配置平台最常见的管控资源对象&#xff0c;在业务拓扑里可以通过划分模块来清晰的可视化管理&#xff1b;那其他资源如何通过配置平台来纳管呢&#xff0c;比如网络设备交换机。场景需求&#xff1a;如何把交换机…

C++ 指针各类型详细解析

文章目录 1. 内存地址 2. 指针 3. 使用指针 4. Null 指针 5. 指针的算术运算 递增一个指针 递减一个指针 指针的比较 6. 指针和数组 7. 指针数组 8. 指向指针的指针&#xff08;多级间接寻址&#xff09; 9. 传递指针给函数 1. 内存地址 通过指针&#xff0c;可以…

【前端 10】初探BOM

初探BOM&#xff1a;浏览器对象模型 在JavaScript的广阔世界中&#xff0c;BOM&#xff08;Browser Object Model&#xff0c;浏览器对象模型&#xff09;扮演着举足轻重的角色。它为我们提供了一套操作浏览器窗口及其组成部分的接口&#xff0c;让我们能够通过编写JavaScript…

QT--线程

一、线程QThread QThread 类提供不依赖平台的管理线程的方法&#xff0c;如果要设计多线程程序&#xff0c;一般是从 QThread继承定义一个线程类&#xff0c;在自定义线程类里进行任务处理。qt拥有一个GUI线程,该线程阻塞式监控窗体,来自任何用户的操作都会被gui捕获到,并处理…