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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值