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;
}
代码说明:
- Base类
:这是一个抽象基类,定义了接口
print()
。 - DerivedA和DerivedB类
:这两个类继承自
Base
,并实现了print()
方法。 - Registry类
:这是一个注册表类,用于管理对象的创建。它使用一个
std::unordered_map
来存储对象名称和对应的创建函数。registerCreator
方法用于注册创建函数,create
方法用于根据名称创建对象。 - registerCreators函数 :这个函数用于注册具体的创建函数。
- main函数
:在
main
函数中,首先注册了DerivedA
和DerivedB
的创建函数,然后通过注册表创建并使用了这些对象。
运行结果:
This is DerivedA
This is DerivedB
Object C not found in registry
总结:
这个示例展示了如何使用C++实现一个简单的注册模式。通过注册模式,你可以将对象的创建逻辑与使用逻辑分离,并且可以在运行时动态地注册和获取对象。这种模式在需要灵活管理对象创建的系统中非常有用。