工厂模式详解:简单工厂、工厂方法、抽象工厂(附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;
};
class ProductA : public Product {
public:
void use() override {
std::cout << "使用产品A\n";
}
};
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();
}
return 0;
}
优点
- 集中管理:对象创建逻辑统一维护
- 客户端解耦:无需了解具体类名
缺点
- 违反OCP原则:新增产品类型需修改工厂类
- 职责过重:工厂类随着产品增多会变得臃肿
2. 工厂方法模式(Factory Method)
应用场景
- 跨平台UI组件:为Windows/MacOS分别创建按钮工厂
- 文档编辑器:支持多种格式导出(PDF/Word工厂)
UML类图
C++实现
点击展开工厂方法代码
#include <iostream>
#include <memory>
class Product {
public:
virtual void use() = 0;
virtual ~Product() = default;
};
class ProductA : public Product {
public:
void use() override {
std::cout << "高端产品A启动\n";
}
};
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;
};
class ConcreteFactoryA : public Factory {
public:
std::unique_ptr<Product> createProduct() override {
return std::make_unique<ProductA>();
}
};
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();
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;
}
优点
- 产品族一致性:确保创建的对象是兼容的
- 切换便捷:通过替换工厂即可改变整个系统风格
缺点
- 扩展困难:新增产品类型需修改所有工厂接口
- 过度设计:简单场景使用会导致不必要的复杂性
最佳实践指南
- 简单工厂:产品类型有限且不常变化时使用
- 工厂方法:需要扩展单一产品线时采用
- 抽象工厂:管理多个关联产品的组合创建