C++单例的一些缺点:
没有自带关键字来实现单例模式,老是需要自己写,但是又有很多类需要使用单例模式。
造成了一种问题:ConfigManager中有单例相关的代码,MySqlManager中有单例相关的代码。
很多类中,有单例相关的代码。自己写了一个实现单例的,比较好的模板:
也就是可以继承的单例模式:
抽象的基类,实现单例逻辑:
template <class T>
class base_manager {
public:
static T *get_instance();
//入口 运行demo示例
virtual void run_demo(UdpMessagePtr &buf) = 0; 改成自己的
protected:
base_manager() = default;
virtual ~base_manager() = default;
private:
static T *m_instance_ptr;
base_manager(base_manager &) = delete;
base_manager &operator=(const base_manager &) = delete;
};
template <typename T>
T *base_manager<T>::m_instance_ptr = new T;
template <typename T>
T *base_manager<T>::get_instance() {
return m_instance_ptr;
}
派生的子类,实现干活的业务逻辑:
例子1:
class asr_manager : public base_manager<asr_manager> {
public:
void run_demo(UdpMessagePtr &buf);
private:
asr_manager() = default;
friend base_manager<asr_manager>;
};
例子2:
class tts_manager : public base_manager<tts_manager> {
public:
void run_demo(UdpMessagePtr &buf);
private:
std::vector<std::string> get_demo_text();
friend base_manager<tts_manager>;
tts_manager() = default;
};
这样,无论代码中有多少单例的类,只需要public继承 base_manager<xxx_manager> 就行了。
- 注意要在派生类中申明 friend base_manager<xxx_manager>; 因为实例是基类的,基类需要访问派生类的构造函数
- 这样做,有点像自己继承了自己,有些奇怪