93、23种设计模式之抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是23种设计模式中的创建型模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,适用于需要保证产品族兼容性、隔离产品创建细节的场景,但扩展新产品种类时需修改核心接口,可能违反开闭原则。 以下是详细介绍:

一、模式定义与核心角色

抽象工厂模式通过抽象接口定义产品族的创建规则,将具体产品的创建延迟到子类实现。其核心包含四个角色:

1.抽象工厂(Abstract Factory)

定义创建产品族的接口,包含多个创建产品的方法(如createButton()、createWindow())。

2.具体工厂(Concrete Factory)

实现抽象工厂接口,负责创建特定产品族的对象(如WindowsFactory创建Windows风格的按钮和窗口)。

3.抽象产品(Abstract Product)

为每种产品定义公共接口(如Button接口的click()方法)。

4.具体产品(Concrete Product)

实现抽象产品接口,由具体工厂创建(如WindowsButton实现Windows按钮的点击行为)。

二、模式特点与优缺点

1.优点

  • 产品族兼容性:确保同一工厂创建的对象风格一致(如Windows工厂生成的按钮和窗口均符合Windows设计规范)。
  • 解耦客户端与实现:客户端仅依赖抽象接口,无需关心具体产品类的创建细节(如切换UI风格时只需更换工厂实例)。
  • 符合开闭原则(部分场景):新增产品族时,只需扩展具体工厂类,无需修改现有代码(如新增Mac风格UI只需添加MacFactory)。

2.缺点

  • 扩展产品种类困难:新增产品类型需修改抽象工厂接口及所有子类(如增加createMenuBar()方法需更新所有工厂类)。
  • 系统复杂性增加:引入多层抽象结构,可能提升理解难度(尤其在产品族和产品等级结构复杂时)。

三、典型应用场景

1.跨平台UI框架

为不同操作系统(Windows、Mac、Linux)创建风格统一的控件(如按钮、文本框),保证界面一致性。

2.数据库访问层

支持多种数据库(MySQL、Oracle、SQL Server),通过抽象工厂屏蔽底层差异,提供统一的数据访问接口。

3.游戏开发

为不同主题或阵营批量生成关联角色、武器和道具(如奇幻主题的精灵、法杖和魔法书)。

4.品牌产品线管理

管理不同品牌(如家电、汽车)的系列产品族,确保产品间功能匹配(如汽车品牌的发动机、轮胎和座椅兼容性)。

四、代码示例(C#)

下面是一个完整的抽象工厂模式在C#中的实现示例,以创建跨平台UI组件为例:

1.定义抽象产品接

csharp 复制代码
// 抽象按钮接口
public interface IButton
{
    void Render();
}

// 抽象复选框接口
public interface ICheckbox
{
    void Render();
}

2. 创建具体产品实现

csharp 复制代码
// Windows风格按钮
public class WindowsButton : IButton
{
    public void Render()
    {
        Console.WriteLine("渲染Windows风格按钮");
    }
}

// MacOS风格按钮
public class MacOSButton : IButton
{
    public void Render()
    {
        Console.WriteLine("渲染MacOS风格按钮");
    }
}

// Windows风格复选框
public class WindowsCheckbox : ICheckbox
{
    public void Render()
    {
        Console.WriteLine("渲染Windows风格复选框");
    }
}

// MacOS风格复选框
public class MacOSCheckbox : ICheckbox
{
    public void Render()
    {
        Console.WriteLine("渲染MacOS风格复选框");
    }
}

3. 定义抽象工厂接口

csharp 复制代码
public interface IUIFactory
{
    IButton CreateButton();
    ICheckbox CreateCheckbox();
}

4. 创建具体工厂实现

csharp 复制代码
// Windows UI工厂
public class WindowsUIFactory : IUIFactory
{
    public IButton CreateButton()
    {
        return new WindowsButton();
    }

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

// MacOS UI工厂
public class MacOSUIFactory : IUIFactory
{
    public IButton CreateButton()
    {
        return new MacOSButton();
    }

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

5. 客户端代码

csharp 复制代码
public class Application
{
    private IButton button;
    private ICheckbox checkbox;
    
    public Application(IUIFactory factory)
    {
        button = factory.CreateButton();
        checkbox = factory.CreateCheckbox();
    }
    
    public void RenderUI()
    {
        button.Render();
        checkbox.Render();
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 根据当前操作系统选择工厂
        IUIFactory factory;
        if (Environment.OSVersion.Platform == PlatformID.Win32NT)
        {
            factory = new WindowsUIFactory();
        }
        else
        {
            factory = new MacOSUIFactory();
        }
        
        // 创建应用并渲染UI
        var app = new Application(factory);
        app.RenderUI();
        
        /* 输出示例(在Windows上):
           渲染Windows风格按钮
           渲染Windows风格复选框
        */
    }
}

五、模式对比与扩展

1.与工厂方法模式的区别

  • 工厂方法模式针对单个产品等级结构(如仅创建按钮),抽象工厂模式针对多个产品等级结构(如同时创建按钮和窗口)。
  • 工厂方法模式的每个产品系列对应一个工厂类,抽象工厂模式的一个工厂类可创建多个相关产品。

2.扩展策略

  • 结合单例模式:确保每个具体工厂类只有一个实例,避免重复创建(如数据库连接池工厂)。
  • 结合建造者模式:处理复杂产品的构建细节(如游戏角色生成时,抽象工厂创建角色骨架,建造者模式填充属性)。
相关推荐
用户6919026813398 小时前
Vibe Coding 开发项目的基本范式
人工智能·设计模式·代码规范
怕浪猫1 天前
领域特定语言(Domain-Specific Language, DSL)
设计模式·程序员·架构
Larcher3 天前
AI Loop:让AI像人一样自主完成任务的核心机制
javascript·人工智能·设计模式
咖啡八杯4 天前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
:mnong4 天前
学习创建结构行为设计模式
设计模式
w_t_y_y5 天前
Agent设计模式(四)多模态融合模式(Multi-Modal Fusion)
设计模式
zhouhui0015 天前
订单状态的 if-else 地狱上线就崩——状态模式的工业级落地
设计模式
geovindu5 天前
go: Reactor Pattern
开发语言·后端·设计模式·golang·反应器模式
一只旭宝5 天前
【C++入门精讲22】常见设计模式
c++·设计模式