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

发布于:2025-08-17 ⋅ 阅读:(14) ⋅ 点赞:(0)

抽象工厂模式(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.定义抽象产品接

// 抽象按钮接口
public interface IButton
{
    void Render();
}

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

2. 创建具体产品实现

// 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. 定义抽象工厂接口

public interface IUIFactory
{
    IButton CreateButton();
    ICheckbox CreateCheckbox();
}

4. 创建具体工厂实现

// 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. 客户端代码

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.扩展策略

  • 结合单例模式:确保每个具体工厂类只有一个实例,避免重复创建(如数据库连接池工厂)。
  • 结合建造者模式:处理复杂产品的构建细节(如游戏角色生成时,抽象工厂创建角色骨架,建造者模式填充属性)。