【设计模式】工厂模式的不同类型、实现方法或应用场景

工厂模式家族是软件工程中最核心的创建型设计模式集合,通过系统化的对象创建解耦策略,为不同复杂度的系统提供灵活的对象实例化方案。本文将深度解析四大经典工厂模式及其现代演进形态。


一、工厂模式族谱架构
演进路径:
简单工厂 → 工厂方法 → 抽象工厂 → 模板工厂(现代C++特化)
            ↗
         注册式工厂(动态扩展)

二、四大经典模式对比矩阵
维度简单工厂模式工厂方法模式抽象工厂模式模板工厂模式
核心目的集中创建逻辑延迟实例化到子类创建产品家族泛型化对象创建
扩展方向纵向扩展(修改工厂)横向扩展(新增工厂)二维扩展(产品族+类型)泛型参数化扩展
典型实现静态方法+switch抽象类+虚函数多方法抽象接口模板类+类型推导
类复杂度O(1)工厂+N产品O(N)工厂+N产品O(M×N)工厂与产品O(1)工厂+N产品
开闭原则违反支持支持支持
适用场景小型固定系统插件式架构跨平台/风格系统泛型库开发
性能损耗虚函数调用开销多虚函数调用编译期优化
C++特性应用-多态继承接口继承模板元编程

三、模式核心价值解析
1. 简单工厂模式(Simple Factory)
  • 核心价值​:快速实现创建逻辑封装
  • 代码示例​:
    class VehicleFactory {
    public:
        enum Type { CAR, BIKE, TRUCK };
        static Vehicle* create(Type type) {
            switch(type) {
                case CAR: return new Car();
                case BIKE: return new Bike();
                default: throw invalid_argument("未知类型");
            }
        }
    };
  • 适用场景​:原型验证、小型工具类开发
2. 工厂方法模式(Factory Method)
  • 核心价值​:多态扩展的创建能力
  • 架构亮点​:
    
    
  • 现代演进​:结合Lambda表达式实现动态工厂
    class DynamicFactory {
        function<unique_ptr<Product>()> creator;
    public:
        template<typename T>
        void setCreator() { 
            creator = [] { return make_unique<T>(); };
        }
        unique_ptr<Product> create() { return creator(); }
    };
3. 抽象工厂模式(Abstract Factory)
  • 核心价值​:产品家族的矩阵式管理
  • 三维产品体系​:
    平台维度UI组件维度
    Windows风格按钮/文本框/表格
    MacOS风格按钮/文本框/表格
    Linux风格按钮/文本框/表格
  • 现代优化​:使用std::variant实现类型安全
    using GUIComponents = variant<WinButton, MacButton, LinuxButton>;
    
    class UniversalFactory {
    public:
        GUIComponents createButton(PlatformType type) {
            switch(type) {
                case Windows: return WinButton();
                case MacOS: return MacButton();
                case Linux: return LinuxButton();
            }
        }
    };
4. 模板工厂模式(Template Factory)
  • 核心价值​:编译期多态与极致性能
  • 现代C++实现​:
    template<typename T, typename... Args>
    class GenericFactory {
    public:
        static auto create(Args... args) {
            return make_unique<T>(args...);
        }
    };
    
    // 使用示例
    auto widget = GenericFactory<Widget, int, string>::create(10, "demo");
  • 编译期验证​:通过static_assert确保类型安全
    template<typename T>
    class Factory {
        static_assert(is_base_of_v<ProductBase, T>, 
                     "T必须派生自ProductBase");
    public:
        static unique_ptr<ProductBase> create() { 
            return make_unique<T>(); 
        }
    };

四、模式选择决策树


五、现代编程中的演进趋势
  1. 响应式工厂模式

    class ReactiveFactory {
        vector<function<void(Product*)>> subscribers;
    public:
        template<typename T>
        void subscribe(auto callback) {
            subscribers.push_back([=](Product* p) {
                if(auto t = dynamic_cast<T*>(p)) 
                    callback(t);
            });
        }
        
        template<typename T>
        void create() {
            auto product = new T();
            for(auto& sub : subscribers) sub(product);
            return product;
        }
    };
  2. AI驱动的动态工厂

    class AIFactory {
        MachineLearningModel model;
    public:
        void train(DataSet data) { model.train(data); }
        
        unique_ptr<Product> create(const string& requirement) {
            auto type = model.predict(requirement);
            return Registry::create(type);
        }
    };
  3. 云原生工厂服务

    class CloudFactory {
        HttpClient client;
    public:
        template<typename T>
        future<unique_ptr<T>> createFromCloud() {
            auto config = co_await client.get("/config");
            return make_unique<T>(config);
        }
    };

六、终极总结:工厂模式四象限

模式类型核心思维技术实现时代演进方向
简单工厂集中管控静态方法+条件判断向工厂方法平滑升级
工厂方法多态扩展虚函数+继承体系结合Lambda动态化
抽象工厂生态构建接口继承+产品矩阵多维参数化+类型擦除
模板工厂泛型编程模板元编程+SFINAE编译期反射+概念约束

选择建议:

  • 初创项目​:从简单工厂起步,逐步演进
  • 跨平台应用​:首选抽象工厂构建产品矩阵
  • 高频扩展系统​:采用工厂方法+动态注册
  • 性能敏感领域​:模板工厂实现零开销抽象

工厂模式的价值不仅在于对象创建本身,更在于其体现了软件设计的维度思维——通过不同粒度的抽象,将变化控制在特定维度,使系统获得弹性扩展能力。理解其本质后,可灵活组合创新,应对未来更复杂的工程挑战。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩瀚之水_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值