设计模式之抽象工厂 C# 范例

在设计模式中,抽象工厂模式(Abstract Factory Pattern) 是一种创建型模式,它提供一个接口,用于创建一组相关或相互依赖的对象,而无需指定具体类。这种模式的关键在于通过抽象工厂来封装产品的创建,允许系统独立于具体产品类的创建、组合和表示。

在 C# 中,抽象工厂模式通常会涉及以下几个组件:

  1. 抽象工厂(Abstract Factory):定义了创建一系列产品的方法。
  2. 具体工厂(Concrete Factory):实现抽象工厂,负责实例化具体产品对象。
  3. 抽象产品(Abstract Product):为一类产品声明接口。
  4. 具体产品(Concrete Product):实现抽象产品接口,定义产品的具体行为。

示例:抽象工厂模式的 C# 实现

假设我们要设计一个跨平台的 UI 工具包,其中包括按钮(Button)和复选框(Checkbox)。每个平台的按钮和复选框外观不同,抽象工厂模式可以帮助我们根据平台创建相应的按钮和复选框对象。

1. 定义抽象产品(Button 和 Checkbox)

// 抽象产品 Button
public interface IButton
{
    void Render();
    void OnClick();
}

// 抽象产品 Checkbox
public interface ICheckbox
{
    void Render();
    void OnCheck();
}

2. 定义具体产品(Windows 和 Mac 上的按钮和复选框)

// 具体产品 WindowsButton
public class WindowsButton : IButton
{
    public void Render()
    {
        Console.WriteLine("Rendering Windows Button");
    }

    public void OnClick()
    {
        Console.WriteLine("Windows Button Clicked");
    }
}

// 具体产品 MacButton
public class MacButton : IButton
{
    public void Render()
    {
        Console.WriteLine("Rendering Mac Button");
    }

    public void OnClick()
    {
        Console.WriteLine("Mac Button Clicked");
    }
}

// 具体产品 WindowsCheckbox
public class WindowsCheckbox : ICheckbox
{
    public void Render()
    {
        Console.WriteLine("Rendering Windows Checkbox");
    }

    public void OnCheck()
    {
        Console.WriteLine("Windows Checkbox Checked");
    }
}

// 具体产品 MacCheckbox
public class MacCheckbox : ICheckbox
{
    public void Render()
    {
        Console.WriteLine("Rendering Mac Checkbox");
    }

    public void OnCheck()
    {
        Console.WriteLine("Mac Checkbox Checked");
    }
}

3. 定义抽象工厂(创建按钮和复选框)

// 抽象工厂
public interface IGUIFactory
{
    IButton CreateButton();
    ICheckbox CreateCheckbox();
}

4. 定义具体工厂(Windows 和 Mac 工厂)

// 具体工厂 WindowsFactory
public class WindowsFactory : IGUIFactory
{
    public IButton CreateButton()
    {
        return new WindowsButton();
    }

    public ICheckbox CreateCheckbox()
    {
        return new WindowsCheckbox();
    }
}

// 具体工厂 MacFactory
public class MacFactory : IGUIFactory
{
    public IButton CreateButton()
    {
        return new MacButton();
    }

    public ICheckbox CreateCheckbox()
    {
        return new MacCheckbox();
    }
}

5. 使用抽象工厂

// 客户端代码,使用抽象工厂模式来创建产品对象
public class Application
{
    private IButton _button;
    private ICheckbox _checkbox;

    // 通过工厂来创建不同平台的控件
    public Application(IGUIFactory factory)
    {
        _button = factory.CreateButton();
        _checkbox = factory.CreateCheckbox();
    }

    public void RenderUI()
    {
        _button.Render();
        _checkbox.Render();
    }

    public void OnButtonClick()
    {
        _button.OnClick();
    }

    public void OnCheckboxCheck()
    {
        _checkbox.OnCheck();
    }
}

6. 客户端代码

class Program
{
    static void Main(string[] args)
    {
        // 创建 Windows 平台的工厂
        IGUIFactory factory = new WindowsFactory();
        Application app = new Application(factory);
        app.RenderUI();
        app.OnButtonClick();
        app.OnCheckboxCheck();

        Console.WriteLine();

        // 创建 Mac 平台的工厂
        factory = new MacFactory();
        app = new Application(factory);
        app.RenderUI();
        app.OnButtonClick();
        app.OnCheckboxCheck();
    }
}

输出

Rendering Windows Button
Rendering Windows Checkbox
Windows Button Clicked
Windows Checkbox Checked

Rendering Mac Button
Rendering Mac Checkbox
Mac Button Clicked
Mac Checkbox Checked

解释

  • IGUIFactory 是抽象工厂,它定义了方法 CreateButton 和 CreateCheckbox,用于创建不同平台上的按钮和复选框。
  • WindowsFactory 和 MacFactory 是具体工厂,分别创建 Windows 和 Mac 上的控件。
  • IButton 和 ICheckbox 是抽象产品接口,WindowsButtonMacButtonWindowsCheckbox 和 MacCheckbox 是具体产品。
  • Application 类通过抽象工厂来获取具体的产品对象,并使用它们来渲染 UI 和响应用户的操作。

优点

  • 抽象工厂模式允许客户端代码在运行时根据平台选择不同的产品族(如 Windows 或 Mac)。
  • 客户端只依赖于抽象工厂接口,不需要关心具体产品的类,增强了系统的灵活性和可扩展性。

通过这种方式,我们可以在不同平台上使用不同的 UI 组件,而不需要修改客户端代码,从而提高了代码的可扩展性和维护性。

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

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

相关文章

IDL学习笔记(一)数据类型、基础运算、控制语句

近期,需要用到modis数据批量预处理,于是重新学习idl,感谢郭师兄推荐,以及张洋老师的详细教导。特以此为学习笔记,望学有所成。 IDL学习笔记(一) 数据类型数据类型创建数组类型转换函数代码输出print往文件…

TYUT设计模式大题

对比简单工厂,工厂方法,抽象工厂模式 比较安全组合模式和透明组合模式 安全组合模式容器节点有管理子部件的方法,而叶子节点没有,防止在用户在叶子节点上调用不适当的方法,保证了的安全性,防止叶子节点暴露…

16asm - 汇编介绍 和 debug使用

文章目录 前言硬件运行机制微机系统硬件组成计算机系统组成8086cpu组织架构dosbox安装配置debug debug使用R命令D命令E命令U命令T命令A命令标志寄存器 总结 前言 各位师傅大家好,我是qmx_07,今天给大家讲解 十六位汇编 和 debug调试器的使用 硬件运行…

自动化检测三维扫描仪-三维扫描仪检测-三维建模自动蓝光测量系统

在现代工业制造领域,特别是在航天航空和汽车行业,产品零部件的精度和质量至关重要。CASAIM自动化智能检测系统能够实现对产品零部件的快速、准确的三维尺寸检测。其自动蓝光测量系统利用蓝色激光光源,通过非接触式扫描,能够快速获…

Maven、JAVAWeb、Servlet

知识点目标 1、MavenMaven是什么Maven项目的目录结构Maven的Pom文件Maven的命令Maven依赖管理Maven仓库JavaWeb项目 2.网络基础知识 3、ServletMaven Maven是什么 Maven是Java的项目管理工具,可以构建,打包,部署项目,还可以管理…

VLC 播放的音视频数据处理流水线搭建

VLC 播放的音视频数据处理流水线搭建 音视频流播放处理循环音频输出处理流水线VLC 用 input_thread_t 对象直接或间接管理音视频播放有关的各种资源,包括 Access, Demux, Decode, Output, Filter 等,这个类型定义 (位于 vlc-3.0.16/include/vlc_input.h) 如下: s…

浅谈edusrc挖掘技巧+信息收集新姿势

目录 1 前言 2 信息收集资产收集 2.1域名查询 2.2邮箱查询 2.3 ICP备案信息查询 3 综合资产查询姿势 3.1 FOFA鹰图 3.2企查查/小蓝本 3.3 黑客语法(Google必应) 4 统一身份认证登录绕过 4.1逻辑缺陷绕过 4.2爆破账户/前端绕过验证 5 纯手工信…

Ubuntu Linux操作系统

一、 安装和搭建 Thank you for downloading Ubuntu Desktop | Ubuntu (这里我们只提供一个下载地址,详细的下载安装可以参考其他博客) 二、ubuntu的用户使用 2.1 常规用户登陆方式 在系统root用户是无法直接登录的,因为root用户的权限过…

RDIFramework.NET CS敏捷开发框架 SOA服务三种访问(直连、WCF、WebAPI)方式

1、介绍 在软件开发领域,尤其是企业级应用开发中,灵活性、开放性、可扩展性往往是项目成功的关键因素。对于C/S项目,如何高效地与后端数据库进行交互,以及如何提供多样化的服务访问方式,是开发者需要深入考虑的问题。…

ProtoBuf快速上手(C++)

在快速上⼿中,会编写第⼀版本的通讯录 1.0。在通讯录 1.0 版本中,将实现: • 对⼀个联系⼈的信息使⽤ PB 进⾏序列化,并将结果打印出来。 • 对序列化后的内容使⽤ PB 进⾏反序列,解析出联系⼈信息并打印出来。 •…

PHP 方头像转为圆图

业务需要把创建海报上的用户头像由方形转为圆形,前端的样式设置不能用。 故采用GD的函数来对方图进行裁剪处理为圆图。 目录 裁剪函数 本地图片 远程图片 效果 参考文章 总结 裁剪函数 从网上找的一个裁剪图片的函数。 代码如下: /* * 将图片切…

代理IP地址的含义与设置指南‌

在数字化时代,互联网已经成为我们日常生活不可或缺的一部分。然而,在享受互联网带来的便利的同时,我们也面临着隐私泄露、访问限制等问题。代理IP地址作为一种有效的网络工具,能够帮助我们解决这些问题。本文将详细介绍代理IP地址…

基于Java Springboot个人财务APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…

红队/白帽必经之路(16)——如何用Metasploit 在边路进行信息刺探及爆破登录[既然是红队,那就对自己狠一点!!!]

欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️网络空间安全——全栈前沿技术持续深入学习 专栏跑道二 ➡️ 24 Network Security -LJS ​ ​ ​ 专栏跑道三 ➡️ MYSQL REDIS Advan…

vue实现echarts饼图自动轮播

echarts官网:Examples - Apache ECharts echartsFn.ts 把echarts函数封装成一个文件 import * as echarts from "echarts";const seriesData [{"value": 12,"name": "过流报警"},{"value": 102,"name&qu…

C++之异常智能指针其他

C之异常&智能指针&其他 异常关于函数异常声明异常的优劣 智能指针auto_ptrunique_ptrshared_ptrweak_ptr定制删除器 智能指针的历史与boost库 特殊类单例模式饿汉和懒汉的优缺点 C四种类型转换CIO流结语 异常 try括起来的的代码块中可能有throw一个异常(可…

混沌工程/混沌测试/云原生测试/云平台测试

背景 私有云/公有云/混合云等具有复杂,分布式,环境多样性等特点,许多特殊场景引发的线上问题很难被有效发现。所以需要引入混沌工程,建立对系统抵御生产环境中失控条件的能力以及信心,提高系统面对未知风险得能力。 …

Hive学习基本概念

基本概念 hive是什么? Facebook 开源,用于解决海量结构化日志的数据统计。 基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能 本质是将HQL转化为MapReduce程序。 Hive处理的数据存储在H…

数据分析流程中的Lambda架构,以及数据湖基于Hadoop、Spark的实现

文章目录 一、Lambda架构1、Lambda的三层架构2、简单解释:3、Lambda架构的优缺点 二、数据湖基于Hadoop、Spark的实现1、架构2、数据管理(存储层的辅助功能) 一、Lambda架构 1、Lambda的三层架构 Batch View(批处理视图层&#…

算法笔记:力扣142.环形链表返回链表入口

该题目通俗来说就是需要返回节点的入口,这点与判断是否有环不同,有环是通过快慢指针的形式来判断,但当快慢指针相等的时候,此时的节点不一定是环的入口节点。所以这题需要注意。 关键API: map.putIfAbsent(key,value)…