目录

CC实现注册模式Registry-Pattern

C/C++实现注册模式(Registry Pattern)

注册模式(Registry Pattern)是一种设计模式,通常用于管理对象的创建和访问。它允许你将对象的创建逻辑与使用逻辑分离,并且可以在运行时动态地注册和获取对象。

下面是一个简单的C++实现注册模式的示例:

#include <iostream>
#include <unordered_map>
#include <memory>
#include <string>
#include <functional>

// 基类
class Base {
public:
    virtual ~Base() = default;
    virtual void print() const = 0;
};

// 派生类A
class DerivedA : public Base {
public:
    void print() const override {
        std::cout << "This is DerivedA" << std::endl;
    }
};

// 派生类B
class DerivedB : public Base {
public:
    void print() const override {
        std::cout << "This is DerivedB" << std::endl;
    }
};

// 注册表类
class Registry {
public:
    using Creator = std::function<std::unique_ptr<Base>()>;

    // 注册创建函数
    void registerCreator(const std::string& name, Creator creator) {
        registry_[name] = std::move(creator);
    }

    // 创建对象
    std::unique_ptr<Base> create(const std::string& name) const {
        auto it = registry_.find(name);
        if (it != registry_.end()) {
            return it->second();
        }
        return nullptr;
    }

    // 单例模式获取注册表实例
    static Registry& getInstance() {
        static Registry instance;
        return instance;
    }

private:
    Registry() = default;
    std::unordered_map<std::string, Creator> registry_;
};

// 注册创建函数
void registerCreators() {
    Registry::getInstance().registerCreator("A", []() { return std::make_unique<DerivedA>(); });
    Registry::getInstance().registerCreator("B", []() { return std::make_unique<DerivedB>(); });
}

int main() {
    // 注册创建函数
    registerCreators();

    // 创建对象并使用
    auto objA = Registry::getInstance().create("A");
    if (objA) {
        objA->print();
    }

    auto objB = Registry::getInstance().create("B");
    if (objB) {
        objB->print();
    }

    // 尝试创建未注册的对象
    auto objC = Registry::getInstance().create("C");
    if (!objC) {
        std::cout << "Object C not found in registry" << std::endl;
    }

    return 0;
}

代码说明:

  1. Base类 :这是一个抽象基类,定义了接口 print()
  2. DerivedA和DerivedB类 :这两个类继承自 Base ,并实现了 print() 方法。
  3. Registry类 :这是一个注册表类,用于管理对象的创建。它使用一个 std::unordered_map 来存储对象名称和对应的创建函数。 registerCreator 方法用于注册创建函数, create 方法用于根据名称创建对象。
  4. registerCreators函数 :这个函数用于注册具体的创建函数。
  5. main函数 :在 main 函数中,首先注册了 DerivedADerivedB 的创建函数,然后通过注册表创建并使用了这些对象。

运行结果:

This is DerivedA
This is DerivedB
Object C not found in registry

总结:

这个示例展示了如何使用C++实现一个简单的注册模式。通过注册模式,你可以将对象的创建逻辑与使用逻辑分离,并且可以在运行时动态地注册和获取对象。这种模式在需要灵活管理对象创建的系统中非常有用。