打印

一个工厂类

[复制链接]
413|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2022-9-15 14:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
class FactoryManager {
public:
    template <typename ProductCreator, typename AbstractProduct>
    void Register(const std::string& name) {
        if (IsRegistered(name)) {
            LOGE("failed to register %s, already registered.", name.c_str());
            NBASSERT(0);
        }
        /*LDRA_NOANALYSIS*/
        producers_[name] = []() -> AbstractProduct* {
            return new ProductCreator();
        };
        /*LDRA_ANALYSIS*/
    }

template <typename AbstractProduct>
AbstractProduct* CreateObject(const std::string& name) {
    if (IsRegistered(name)) {
        return reinterpret_cast<AbstractProduct*>(producers_[name]());
    } else {
        return nullptr;
    }
}

bool IsRegistered(const std::string& name) {
    return producers_.count(name) > 0;
}

private:
    std::unordered_map<std::string, std::function<void* ()>> producers_;
    DECLARE_SINGLETON(FactoryManager)
};

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1349

主题

12425

帖子

53

粉丝