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组件(如按钮和文本框):

csharp 复制代码
// 抽象产品:按钮
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 Button
        winTextBox.Display(); // 输出:Displaying Windows TextBox

        // 切换到Web UI工厂
        IUIFactory webFactory = new WebUIFactory();
        IButton webButton = webFactory.CreateButton();
        ITextBox webTextBox = webFactory.CreateTextBox();

        // 显示Web UI元素
        webButton.Display(); // 输出:Displaying Web Button
        webTextBox.Display(); // 输出:Displaying Web TextBox

        // 注意:这里假设了Display方法在每个UI元素上都有定义,
        // 并且这些方法会输出相应的字符串到控制台或某种日志系统。
        // 在实际的应用程序中,这些UI元素的显示可能涉及更复杂的UI框架或图形库。
    }
}

总结

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

相关推荐
留不住丨晚霞23 分钟前
说说SpringBoot常用的注解?
java·开发语言
华科云商xiao徐29 分钟前
Java多线程爬虫动态线程管理实现
java·爬虫·数据挖掘
柒七爱吃麻辣烫38 分钟前
八股文系列-----SpringBoot自动配置的流程
java·spring boot·rpc
M1A143 分钟前
Java 面试系列第一弹:基础问题大盘点
java·后端·mysql
发仔12343 分钟前
Dubbo介绍及示例用法
java·dubbo
goxingman1 小时前
关于使用idea打包的时候报错,Maven提示乱码java: �Ҳ�������
java·maven·intellij-idea
邓不利东2 小时前
Spring中过滤器和拦截器的区别及具体实现
java·后端·spring
草履虫建模3 小时前
Redis:高性能内存数据库与缓存利器
java·数据库·spring boot·redis·分布式·mysql·缓存
苹果醋33 小时前
Vue3组合式API应用:状态共享与逻辑复用最佳实践
java·运维·spring boot·mysql·nginx
枯萎穿心攻击3 小时前
ECS由浅入深第三节:进阶?System 的行为与复杂交互模式
开发语言·unity·c#·游戏引擎