工厂模式的三种类型

工厂模式详解:简单工厂、工厂方法、抽象工厂(附C++实现)

三种模式快速对比

特性简单工厂工厂方法抽象工厂
创建对象类型单一产品单一产品产品族
扩展性需修改工厂类新增工厂类新增工厂类
符合开闭原则
适用场景产品类型固定单一产品扩展多关联产品组合扩展

1. 简单工厂模式(Simple Factory)

应用场景

  • 日志系统:根据配置文件创建FileLogger或ConsoleLogger
  • 数据库连接:根据URL参数生成MySQL/Oracle连接对象

C++实现

#include <iostream>
#include <memory>
#include <string>

// 抽象产品
class Product {
public:
    virtual void use() = 0;
    virtual ~Product() = default;
};

// 具体产品A
class ProductA : public Product {
public:
    void use() override {
        std::cout << "使用产品A\n";  // 添加换行符
    }
};

// 具体产品B
class ProductB : public Product {
public:
    void use() override {
        std::cout << "使用产品B\n";
    }
};

// 简单工厂(生产中枢)
class SimpleFactory {
public:
    static std::unique_ptr<Product> createProduct(const std::string& type) {
        if (type == "A") {
            return std::make_unique<ProductA>();
        } else if (type == "B") {
            return std::make_unique<ProductB>();
        }
        return nullptr;  // 处理无效类型
    }
};

// 客户端调用
int main() {
    auto product = SimpleFactory::createProduct("A");
    if (product) {
        product->use();  // 输出:使用产品A
    }
    return 0;
}

优点

  • 集中管理:对象创建逻辑统一维护
  • 客户端解耦:无需了解具体类名

缺点

  • 违反OCP原则:新增产品类型需修改工厂类
  • 职责过重:工厂类随着产品增多会变得臃肿

2. 工厂方法模式(Factory Method)

应用场景

  • 跨平台UI组件:为Windows/MacOS分别创建按钮工厂
  • 文档编辑器:支持多种格式导出(PDF/Word工厂)

UML类图

«interface»
Factory
+createProduct() : Product
ConcreteFactoryA
+createProduct() : ProductA
ConcreteFactoryB
+createProduct() : ProductB

C++实现

点击展开工厂方法代码
#include <iostream>
#include <memory>

// 抽象产品
class Product {
public:
    virtual void use() = 0;
    virtual ~Product() = default;
};

// 具体产品A
class ProductA : public Product {
public:
    void use() override {
        std::cout << "高端产品A启动\n";
    }
};

// 具体产品B
class ProductB : public Product {
public:
    void use() override {
        std::cout << "经济型产品B就绪\n";
    }
};

// 抽象工厂
class Factory {
public:
    virtual std::unique_ptr<Product> createProduct() = 0;
    virtual ~Factory() = default;
};

// 具体工厂A
class ConcreteFactoryA : public Factory {
public:
    std::unique_ptr<Product> createProduct() override {
        return std::make_unique<ProductA>();
    }
};

// 具体工厂B
class ConcreteFactoryB : public Factory {
public:
    std::unique_ptr<Product> createProduct() override {
        return std::make_unique<ProductB>();
    }
};

// 客户端调用
int main() {
    std::unique_ptr<Factory> luxuryFactory = std::make_unique<ConcreteFactoryA>();
    auto premiumProduct = luxuryFactory->createProduct();
    premiumProduct->use();  // 输出:高端产品A启动

    return 0;
}

优点

  • 符合OCP原则:新增产品无需修改已有代码
  • 多态性:客户端依赖抽象接口,不绑定具体类

缺点

  • 类爆炸:每个产品对应一个工厂类
  • 复杂度增加:需要维护更多类之间的关系

3. 抽象工厂模式(Abstract Factory)

应用场景

  • 游戏引擎:创建奇幻风格(剑+法师)或科幻风格(激光枪+机甲)套装
  • GUI主题包:生成配套的按钮/滚动条/对话框组件

C++实现

#include <iostream>
#include <memory>

//------ 抽象产品族 ------
class Weapon {
public:
    virtual void attack() = 0;
    virtual ~Weapon() = default;
};

class Armor {
public:
    virtual void defend() = 0;
    virtual ~Armor() = default;
};

//------ 具体产品 ------
class Sword : public Weapon {
public:
    void attack() override {
        std::cout << "挥舞长剑!\n";
    }
};

class PlateArmor : public Armor {
public:
    void defend() override {
        std::cout << "板甲防御!\n";
    }
};

class LaserGun : public Weapon {
public:
    void attack() override {
        std::cout << "发射激光!\n";
    }
};

class PowerSuit : public Armor {
public:
    void defend() override {
        std::cout << "能量护盾激活!\n";
    }
};

//------ 抽象工厂 ------
class EquipmentFactory {
public:
    virtual std::unique_ptr<Weapon> createWeapon() = 0;
    virtual std::unique_ptr<Armor> createArmor() = 0;
    virtual ~EquipmentFactory() = default;
};

//------ 具体工厂 ------
class MedievalFactory : public EquipmentFactory {
public:
    std::unique_ptr<Weapon> createWeapon() override {
        return std::make_unique<Sword>();
    }
    std::unique_ptr<Armor> createArmor() override {
        return std::make_unique<PlateArmor>();
    }
};

class SciFiFactory : public EquipmentFactory {
public:
    std::unique_ptr<Weapon> createWeapon() override {
        return std::make_unique<LaserGun>();
    }
    std::unique_ptr<Armor> createArmor() override {
        return std::make_unique<PowerSuit>();
    }
};

//------ 客户端 ------
int main() {
    // 切换工厂即可改变整套装备风格
    std::unique_ptr<EquipmentFactory> factory = std::make_unique<SciFiFactory>();
    
    auto weapon = factory->createWeapon();
    auto armor = factory->createArmor();
    
    weapon->attack();  // 输出:发射激光!
    armor->defend();   // 输出:能量护盾激活!
    
    return 0;
}

优点

  • 产品族一致性:确保创建的对象是兼容的
  • 切换便捷:通过替换工厂即可改变整个系统风格

缺点

  • 扩展困难:新增产品类型需修改所有工厂接口
  • 过度设计:简单场景使用会导致不必要的复杂性

最佳实践指南

  1. 简单工厂:产品类型有限且不常变化时使用
  2. 工厂方法:需要扩展单一产品线时采用
  3. 抽象工厂:管理多个关联产品的组合创建
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

star _chen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值