C++工厂模式: 简单工厂/工厂方法/抽象工厂
请用C++实现三种工厂模式:简单工厂(Simple Factory)、工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory),并说明各自的适用场景和优缺点。
回答
孤独的心
1. 简单工厂:一个工厂类负责创建所有产品,新增产品需修改工厂类(违反开闭原则)。
class Product {};
class ProductA : public Product {};
class ProductB : public Product {};
class SimpleFactory {
public:
static std::unique_ptr<Product> create(Type t) {
switch (t) {
case Type::A: return std::make_unique<ProductA>();
case Type::B: return std::make_unique<ProductB>();
}
}
};
2. 工厂方法模式:将对象创建延迟到子类,每个产品对应一个具体工厂。
class Factory {
public:
virtual ~Factory() = default;
virtual std::unique_ptr<Product> create() = 0;
};
class FactoryA : public Factory {
std::unique_ptr<Product> create() override { return std::make_unique<ProductA>(); }
};
符合开闭原则,但类数量增多。
3. 抽象工厂模式:创建一系列相关或依赖的对象族。
class GUIFactory {
public:
virtual std::unique_ptr<Button> createButton() = 0;
virtual std::unique_ptr<Checkbox> createCheckbox() = 0;
};
class WinFactory : public GUIFactory { /* 创建Win风格的控件 */ };
class MacFactory : public GUIFactory { /* 创建Mac风格的控件 */ };
新增产品族则需修改抽象工厂接口。
C++现代实践:优先用函数指针/Lambda作为工厂,避免虚函数层次:
std::unordered_map<std::string, std::function<std::unique_ptr<Product>()>> factories;
factories["A"] = []{ return std::make_unique<ProductA>(); };