CodeWalk

C++工厂模式: 简单工厂/工厂方法/抽象工厂

作者:孤独的心 · 2026-05-30 12:55

请用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>(); };