当前位置: 首页 > 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框架或图形库。}
}

总结

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Servlet2-HTTP协议、HttpServletRequest类、HttpServletResponse类
  • 当全球银行系统“崩溃”时会发生什么?
  • RocketMQ的详细讲解(四种mq的对比(activeMq、rabbitmq、rocketmq、kafka))
  • 【Android】广播机制
  • 密码暴力破解漏洞2024.7.26
  • AI变现:科技与商业化的交织
  • Vue.js 搭建大屏可视化项目
  • 【RabbitMQ】MQ相关概念
  • 西蒙学习法
  • 【HarmonyOS】HarmonyOS NEXT学习日记:七、页面与组件的生命周期
  • day4 vue2以及ElementUI
  • 滞回比较器工作原理,应用,TINA仿真
  • 7月23日JavaSE学习笔记
  • scrapy出现OSError: could not get source code错误解决
  • 【MQTT(5)】php 做一个mqtt按钮,发布触发信号
  • Google 是如何开发 Web 框架的
  • android 一些 utils
  • Bytom交易说明(账户管理模式)
  • CentOS6 编译安装 redis-3.2.3
  • echarts花样作死的坑
  • JS学习笔记——闭包
  • Wamp集成环境 添加PHP的新版本
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 盘点那些不知名却常用的 Git 操作
  • 如何合理的规划jvm性能调优
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • #APPINVENTOR学习记录
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $.ajax()
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (7) cmake 编译C++程序(二)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (solr系列:一)使用tomcat部署solr服务
  • (笔记)M1使用hombrew安装qemu
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (总结)(2)编译ORB_SLAM2遇到的错误
  • .axf 转化 .bin文件 的方法
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .NET MVC 验证码
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET中两种OCR方式对比
  • .NET中使用Redis (二)
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [Android Studio] 开发Java 程序
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [BJDCTF2020]The mystery of ip
  • [BT]BUUCTF刷题第9天(3.27)