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

设计模式之抽象工厂 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.kler.cn/a/415403.html

相关文章:

  • 浅谈telnet和ping
  • STL基本算法之copy与copy_backward
  • 【iOS】知乎日报总结
  • Android获取内置卡、内置U盘和挂载U盘路径和内存大小
  • 医院分诊管理系统|Java|SSM|VUE| 前后端分离
  • 【H2O2|全栈】Node.js(2)
  • 力扣637. 二叉树的层平均值
  • 公开整理-中国省级人工智能专利统计数据(2010-2022年)
  • Android Studio安装TalkX AI编程助手
  • 单例模式(Singleton Pattern):深入解析与应用场景
  • ASUS/华硕天选5Pro酷睿版 FX607J 原厂Win11 23H2系统 工厂文件 带ASUS Recovery恢复
  • 使用Apache HttpClient发起一个GET HTTP请求
  • C++(模板)
  • 新增工作台模块,任务中心支持一键重跑,MeterSphere开源持续测试工具v3.5版本发布
  • 线段树讲解
  • 宠物领养技术:SpringBoot框架应用
  • 一个简洁的ajax注册登录找回密码切换的前端页面
  • 原生js上传图片
  • Spring 返回JSON
  • Rust个人认为将抢占C和C++市场,逐渐成为主流的开发语言
  • Hackathon靶机系列Hackathon2
  • 求助:selenium.common.exceptions.SessionNotCreatedException: x x x
  • 【小白学机器学习41】如何从正态分布的总体中去抽样? 获得指定正态分布的样本的2种方法
  • 存储结构及关系(一)
  • 计算机的错误计算(一百六十九)
  • 力扣700:二叉搜索树中的搜索