自动注册工厂

引言:前两天看到关注的公众号上使用模板和宏进行工厂类的自动注册,觉得很不错,但是对模板和宏不是很熟悉,于是删去这两个要素重新编写,实现要简单一些,思路会更加清晰一点。

废话不多说,上代码。之后会对模板和宏进行复习,不一定是用在自动注册工厂类上。

#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();
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值