一、模式核心思想:产品族的动态装配

抽象工厂模式是创建型设计模式的集大成者,专门用于解决相关产品族的创建问题。其核心在于通过多层抽象隔离,让客户端无需关心具体实现类,即可创建整套相互关联的工业级组件。例如:

  • 跨平台UI套件(Windows/MacOS按钮+文本框组合)
  • 多品牌汽车零件(奔驰发动机+宝马变速箱)
  • 电商多商户体系(淘宝支付+物流 VS 京东支付+物流)

这种模式完美遵循依赖倒置原则,将对象创建逻辑提升到抽象层级。


二、模式架构四重奏
classDiagram
    class IAbstractFactory {
        <<interface>>
        +CreateProductA() IProductA
        +CreateProductB() IProductB
    }
    class ConcreteFactory1
    class ConcreteFactory2
    class IProductA {
        <<interface>>
        +Operation()
    }
    class IProductB {
        <<interface>>
        +Operation()
    }
    ConcreteFactory1 --> ProductA1
    ConcreteFactory1 --> ProductB1
    ConcreteFactory2 --> ProductA2
    ConcreteFactory2 --> ProductB2
  1. ​抽象工厂接口
    定义创建整套产品的抽象方法集合:

    public interface IUIFactory {
        IButton CreateButton();
        ITextBox CreateTextBox();
    }
  2. ​具体工厂类
    实现特定产品族的完整创建逻辑:

    public class WindowsUIFactory : IUIFactory {
        public IButton CreateButton() => new WinButton();
        
        public ITextBox CreateTextBox() => new WinTextBox();
    }
  3. ​抽象产品接口
    规范组件的基础功能:

    public interface IButton {
        void Render();
        void Click();
    }
  4. ​具体产品类
    实现平台特定的功能细节:

    public class MacButton : IButton {
        public void Render() => Console.WriteLine("Mac风格按钮渲染");
        public void Click() => Console.WriteLine("触发Mac点击动画");
    }

三、工业级C#示例:跨平台UI组件库
1. 抽象层定义
// 抽象工厂
public interface IUIFactory {
    IButton CreateButton();
    ITextBox CreateTextBox();
}

// 抽象产品
public interface IButton {
    void Render();
}

public interface ITextBox {
    void Input(string text);
}
2. Windows实现
public class WindowsUIFactory : IUIFactory {
    public IButton CreateButton() => new WinButton();
    
    public ITextBox CreateTextBox() => new WinTextBox();
}

class WinButton : IButton {
    public void Render() => Console.WriteLine("Windows风格扁平化按钮");
}

class WinTextBox : ITextBox {
    public void Input(string text) => Console.WriteLine($"Win输入框内容:{text}");
}
3. MacOS实现
public class MacUIFactory : IUIFactory {
    public IButton CreateButton() => new MacButton();
    
    public ITextBox CreateTextBox() => new MacTextBox();
}

class MacButton : IButton {
    public void Render() => Console.WriteLine("MacOS金属质感按钮");
}

class MacTextBox : ITextBox {
    public void Input(string text) => Console.WriteLine($"Mac输入框内容:{text}");
}
4. 客户端调用
// 动态切换整套UI风格
IUIFactory factory = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) 
                    ? new WindowsUIFactory() 
                    : new MacUIFactory();

var button = factory.CreateButton();
var textBox = factory.CreateTextBox();

button.Render();
textBox.Input("Hello Factory Pattern!");

四、模式优势与挑战
​维度优势挑战
​扩展性新增产品族只需扩展新工厂类(如新增LinuxUI)新增产品类型需修改所有工厂接口(如新增ICheckbox)
​代码耦合度客户端与具体类完全解耦抽象层设计需高度前瞻性
​维护成本产品族修改集中管理简单场景可能造成过度设计
​工业适用性完美适配汽车制造、跨平台开发等需要成套组件的场景不适合独立变化的零件系统

五、最佳实践与陷阱规避
  1. ​工厂接口设计原则

    • 每个工厂方法对应一个产品层级
    • 保持产品创建方法的正交性
  2. ​DI容器集成方案

    // Autofac配置示例
    builder.RegisterType<WindowsUIFactory>().As<IUIFactory>()
           .When(r => RuntimeInformation.IsOSPlatform(OSPlatform.Windows));
  3. ​性能优化策略

    • 预编译表达式树加速反射创建
    • 对象池复用高频组件
  4. ​防御性编程要点

    public class RobustUIFactory : IUIFactory {
        public IButton CreateButton() {
            try {
                return new SafeButton();
            } catch (ComponentInitException ex) {
                return new FallbackButton();
            }
        }
    }

六、模式演进路线图
graph TD
    A[简单工厂] --> B{产品复杂度}
    B -->|单产品线| C[工厂方法模式]
    B -->|多关联产品| D[抽象工厂模式]
    D --> E[支持插件化扩展]
    E --> F[结合IoC容器实现动态装配]

通过抽象工厂模式,开发者可以构建如航天控制系统(传感器+执行器成套设备)、跨平台游戏引擎(OpenGL/Vulkan渲染管线)等复杂工业系统。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐