CppStack

C++技术栈一站式学习 · ‌业精于勤,荒于嬉;行成于思,毁于随。

C++ 设计模式详解(一):创建型模式

Tags = [ C++Pattern ]

创建型模式(Creational Patterns)关注 对象的创建过程,通过封装实例化逻辑,使系统更灵活地应对变化。
常见的创建型模式包括:

  1. 单例(Singleton)
  2. 工厂方法(Factory Method)
  3. 抽象工厂(Abstract Factory)
  4. 建造者(Builder)
  5. 原型(Prototype)

创建型模式详解


1. 单例模式(Singleton)

定义:保证一个类只有一个实例,并提供全局访问点。
场景

  • 日志系统。
  • 配置管理器。
  • 线程池。
#include <iostream>

class Singleton {
private:
    Singleton() { std::cout << "Init\n"; }
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
public:
    static Singleton& getInstance() {
        static Singleton instance; // C++11 保证线程安全
        return instance;
    }
};

int main() {
    Singleton& s1 = Singleton::getInstance();
    Singleton& s2 = Singleton::getInstance();
    std::cout << (&s1 == &s2); // 输出 1
}

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

定义:定义一个创建对象的接口,让子类决定实例化哪一个类。
场景

  • 跨平台 UI 控件。
  • 数据库驱动。
#include <iostream>
#include <memory>

class Product {
public:
    virtual void use() = 0;
    virtual ~Product() = default;
};

class ConcreteProductA : public Product {
public:
    void use() override { std::cout << "Use A\n"; }
};

class Factory {
public:
    virtual std::unique_ptr<Product> create() = 0;
    virtual ~Factory() = default;
};

class FactoryA : public Factory {
public:
    std::unique_ptr<Product> create() override {
        return std::make_unique<ConcreteProductA>();
    }
};

int main() {
    FactoryA f;
    auto p = f.create();
    p->use();
}

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

定义:提供一个接口,创建一系列相关或依赖对象,而无需指定具体类。
场景

  • 跨平台 GUI(Windows/Linux/Mac)。
  • 数据库族(MySQL/Oracle)。
#include <iostream>
#include <memory>

class Button { 
public: 
    virtual void draw() = 0; 
    virtual ~Button()=default;
};

class WinButton : public Button { 
public: 
    void draw() override { std::cout << "WinButton\n"; } 
};

class MacButton : public Button { 
public: 
    void draw() override { std::cout << "MacButton\n"; } 
};

class GUIFactory {
public:
    virtual std::unique_ptr<Button> createButton() = 0;
    virtual ~GUIFactory()=default;
};

class WinFactory : public GUIFactory {
public:
    std::unique_ptr<Button> createButton() override { return std::make_unique<WinButton>(); }
};

class MacFactory : public GUIFactory {
public:
    std::unique_ptr<Button> createButton() override { return std::make_unique<MacButton>(); }
};

int main() {
    std::unique_ptr<GUIFactory> f = std::make_unique<WinFactory>();
    auto btn = f->createButton();
    btn->draw();
}

4. 建造者模式(Builder)

定义:将复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
场景

  • 游戏角色构建。
  • 复杂文档生成器。
#include <iostream>
#include <string>

class Product {
public:
    std::string parts;
    void show() { std::cout << "Product: " << parts << "\n"; }
};

class Builder {
public:
    virtual void buildPartA() = 0;
    virtual void buildPartB() = 0;
    virtual Product getResult() = 0;
    virtual ~Builder()=default;
};

class ConcreteBuilder : public Builder {
    Product p;
public:
    void buildPartA() override { p.parts += "A "; }
    void buildPartB() override { p.parts += "B "; }
    Product getResult() override { return p; }
};

class Director {
public:
    Product construct(Builder& b) {
        b.buildPartA();
        b.buildPartB();
        return b.getResult();
    }
};

int main() {
    ConcreteBuilder b;
    Director d;
    Product p = d.construct(b);
    p.show();
}

5. 原型模式(Prototype)

定义:通过复制已有对象来创建新对象。
场景

  • 对象创建成本高(如需要复杂计算、数据库访问、大量参数准备)。
  • 需要避免复杂的构造过程,比如在图形编辑器、文档处理器中,经常需要复制已有元素,应用原型模式会更自然。
#include <iostream>
#include <memory>

class Prototype {
public:
    virtual std::unique_ptr<Prototype> clone() = 0;
    virtual void show() = 0;
    virtual ~Prototype() = default;
};

class ConcretePrototype : public Prototype {
    int data;
public:
    ConcretePrototype(int d):data(d){}
    std::unique_ptr<Prototype> clone() override {
        return std::make_unique<ConcretePrototype>(*this);
    }
    void show() override { std::cout << "Data: " << data << "\n"; }
};

int main() {
    auto p1 = std::make_unique<ConcretePrototype>(42);
    auto p2 = p1->clone();
    p2->show();
}

总结

  • 单例:全局唯一实例。
  • 工厂方法:子类决定实例化。
  • 抽象工厂:创建一族相关对象。
  • 建造者:分步骤构建复杂对象。
  • 原型:通过克隆创建对象。

创建型模式的核心是 将对象的创建过程与使用解耦,从而提升系统的灵活性和可维护性。