引言:前两天看到关注的公众号上使用模板和宏进行工厂类的自动注册,觉得很不错,但是对模板和宏不是很熟悉,于是删去这两个要素重新编写,实现要简单一些,思路会更加清晰一点。
废话不多说,上代码。之后会对模板和宏进行复习,不一定是用在自动注册工厂类上。
#include <iostream>
#include <map>
#include <utility>
#include <functional>
using namespace std;
/*********************
*1.一个单例的工厂模式
*2.工厂的注册对象
*3.一个辅助类
*4.利用宏去进行对象的注册
*5.在派生类当中去调用
**********************/
class Message
{
public:
virtual void _cout() {}
};
class registerFactory
{
public:
static Message* produce(const std::string &key)
{
if (map_.find(key) == map_.end())
throw std::invalid_argument("the message key is not exist!");
return map_[key];
}
static std::unique_ptr<Message> produce_unique(const std::string& key)
{
return std::unique_ptr<Message>(produce(key));
}
static std::shared_ptr<Message> produce_shared(const std::string& key)
{
return std::shared_ptr<Message>(produce(key));
}
static void register_t(const string &key,Message *e)
{
registerFactory::getObj().map_.emplace(std::make_pair(key, e));
};
private:
registerFactory() {};
registerFactory(const registerFactory&) = delete;
registerFactory(registerFactory&&) = delete;
inline static registerFactory& getObj()
{
static registerFactory instance;
return instance;
}
static std::map<std::string , Message* > map_;
};
std::map<std::string, Message* > registerFactory::map_;
class Message1 : public Message
{
public:
void _cout() override
{
cout << name.c_str()<<endl;
}
private:
std::string name = "Message1";
};
int main()
{
Message1 *mess = new Message1();
registerFactory::register_t("Message1", mess);
Message *mess1=registerFactory::produce("Message1");
Message1 *me=dynamic_cast<Message1*>(mess1);
me->_cout();
}