设计模式之抽象工厂 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 组件,而不需要修改客户端代码,从而提高了代码的可扩展性和维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于PoE交换机的智慧停车场监控组网应用

伴随城市发展快速,汽车保有量也不断增长,导致停车管理问题也愈发凸显。针对包括路侧停车位、地面停车场、地下停车场等场景的停车管理需求,通常会部署监控设备进行车位监测、现场安全监测等,助力构建智能化停车管理。因此如何为分…

直接抄作业!Air780E模组LuatOS开发:位运算(bit)示例

在嵌入式开发中,位运算是一种高效且常用的操作技巧。本文将介绍如何使用Air780E模组和LuatOS进行位运算,并通过示例代码帮助读者快速上手。 一、位运算概述 位运算是一种在计算机系统中对二进制数位进行操作的运算。由于计算机内部数据的存储和处理都是…

多点DMALL启动招股:将在港交所上市,聚焦数字零售服务

近日,多点数智有限公司(Dmall Inc.,下称“多点”或“多点DMALL”)发布全球发售文件,于11月28日至12月3日招股,预计将于2024年12月6日在港交所主板挂牌上市。 招股书显示,多点DMALL本次全球发售的…

WRF-Chem模式安装、环境配置、原理、调试、运行方法;数据准备及相关参数设置方法

大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果,同时气象因素是控制大气污染的关键自然因素。大气污染问题既是局部、当地的,也是区域的,甚至是全球的。本地的污染物排放除了对当地造成严重影响外,同时还会在…

离线安装 Docker-IO:详细步骤指南

离线安装 Docker-IO:详细步骤指南 一、准备工作1.1 下载 Docker 离线安装包1.2 准备安装环境1.3 配置防火墙和 SELinux(可选)二、上传和解压离线安装包2.1 上传安装包2.2 解压安装包三、安装 Docker-IO3.1 移动 Docker 文件到系统目录3.2 配置 Docker 服务3.3 赋予服务文件执…

拥抱 OpenTelemetry:阿里云 Java Agent 演进实践

作者:陈承 背景 在 2018 年的 2 月,ARMS Java Agent 的第一个版本正式发布,为用户提供无侵入的的可观测数据采集服务。6 年后的今天,随着软件技术的迅猛发展、业务场景的逐渐丰富、用户规模的快速增长,我们逐渐发现过…

【信息系统项目管理师】第3章:信息系统治理 考点梳理

文章目录 3.1 IT 治理3.1.1 IT治理基础3.1.2 IT治理体系3.1.3 IT治理任务3.1.4 IT治理方法与标准 3.2 IT 审计3.2.1 IT审计基础3.2.2 审计方法与技术3.2.3 审计流程3.2.4 审计内容 3.1 IT 治理 IT治理起到重要的统筹、评估、指导和监督作用。 信息技术审计(IT审计)作为与IT治…

DRM(数字权限管理技术)防截屏录屏----ffmpeg安装

提示:ffmpeg安装 文章目录 [TOC](文章目录) 前言一、下载二、配置环境变量三、运行ffmpeg四、文档总结 前言 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的…

github webhooks 实现网站自动更新

本文目录 Github Webhooks 介绍Webhooks 工作原理配置与验证应用云服务器通过 Webhook 自动部署网站实现复制私钥编写 webhook 接口Github 仓库配置 webhook以服务的形式运行 app.py Github Webhooks 介绍 Webhooks是GitHub提供的一种通知方式,当GitHub上发生特定事…

全桥LLC变换器原理及MATLAB仿真模型

“电气仔推送”获得资料(专享优惠) 主电路拓扑 全桥LLC 谐振变换器主电路拓扑结构图。图中S1 ~ S4为功率开关管, D1 ~ D4为功率开关管的体二极管, C1 ~ C4 为功率开关管的寄生电容。谐振电感r…

使用R语言进行美国失业率时空分析(包括绘图)

今天写一篇利用R语言,针对面板数据的简单分析与绘图。让我们直接开始把。 一、数据准备 这次的示例数据非常简单,只有一个shp格式的美国区县矢量数据,我们在QGIS中打开数据查看一下它的属性表。事实上我们需要的数据都在属性表的字段中。 二…

PostgreSQL在Linux环境下的常用命令总结

标题 登录PgSQL库表基本操作命令新建库表修改库表修改数据库名称:修改表名称修改表字段信息 删除库表pgsql删除正在使用的数据库 须知: 以下所有命令我都在Linux环境中执行验证过,大家放心食用,其中的实际名称换成自己的实际名称即…

React Native学习笔记(三)

一 组件简介 1.1 简介 RN中的核心组件,是对原生组件的封装 原生组件:Android或ios内的组件核心组件:RN中常用的,来自react-native的组件 原生组件 在 Android 开发中是使用 Kotlin 或 Java 来编写视图;在 iOS 开发…

TsingtaoAI具身智能高校实训方案通过华为昇腾技术认证

日前,TsingtaoAI推出的“具身智能高校实训解决方案-从AI大模型机器人到通用具身智能”基于华为技术有限公司AI框架昇思MindSpore,完成并通过昇腾相互兼容性技术认证。 TsingtaoAI&华为昇腾联合解决方案 本项目“具身智能高校实训解决方案”以实现高…

基于matlab程序实现人脸识别

1.人脸识别流程 1.1.1基本原理 基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb—Cr子平面上的投影将缩减,与中心区域显著不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。…

SQL Server管理员sa登录失败原因

文章目录 一、开启混合登录模式二、启用sa三、更改密码四、登录sa一、开启混合登录模式 用Windows身份登录数据库服务。 在连接名上右键→属性。 在安全性选项卡下,选择【SQL Server和Windows身份验证模式】,点击【确定】,提示需要重启服务。 Win+R,输入指令:services.ms…

15分钟做完一个小程序,腾讯这个工具有点东西

我记得很久之前,我们都在讲什么低代码/无代码平台,这个概念很久了,但是,一直没有很好的落地,整体的效果也不算好。 自从去年 ChatGPT 这类大模型大火以来,各大科技公司也都推出了很多 AI 代码助手&#xff…

探秘多源异构数据:开启数据融合新时代

多源异构数据,其 “多源” 体现了数据来源的广泛多样性。在当今数字化时代,数据可能来自于不同的系统,比如企业内部可能同时使用多种管理系统,如 ERP(企业资源计划)系统、CRM(客户关系管理&…

R语言结构方程模型(SEM)在生态学领域中的应用

目录 专题一、R/Rstudio简介及入门 专题二、结构方程模型(SEM)介绍 专题三:R语言SEM分析入门:lavaan VS piecewiseSEM 专题四:SEM全局估计(lavaan)在生态学领域高阶应用 专题五&#xff1…

springboot中使用mongodb完成评论功能

pom文件中引入 <!-- mongodb --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> yml中配置连接 data:mongodb:uri: mongodb://admin:1234561…