首页 > 代码库 > 设计模式之(Singleton)模式的几种实现
设计模式之(Singleton)模式的几种实现
第一种:低效率实现
这种实现方法,优点是实现简单,缺点是在多线程频繁访问下效率比较低,经常出现锁竞争。适应于不需要频繁访问实例的情况下。
class Singleton{public: static Singleton* GetInstance() { AutoLock lock(mutex); if (!m_instance) m_instance = new Singleton; return m_instance; }private: Singleton(){}; Singleton(const Singleton &); Singleton & operator =(const Singleton &); static Singleton *m_instance; static Mutex m_mutex;}
第二种:两次检查实例指针
这种实现方法相对与第一种效率要高,只要未实例化的情况下进行加锁,但是代码看起来不够简洁,需要两次检查实例指针是否为空。适用于需要频繁获取实例的情况下。
class Singleton{public: static Singleton* GetInstance() { if (!m_instance) { AutoLock lock(mutex); if (!m_instance) m_instance = new Singleton; } return m_instance; }private: Singleton(){}; Singleton(const Singleton &); Singleton & operator =(const Singleton &); static Singleton *m_instance; static Mutex m_mutex;}Mutex Singleton::m_mutex;Singleton* Singleton::m_instance = NULL;
第三种:程序启动时即初始化
这种实现方法,相对于前面两种都要简单,缺点是程序一启动便在堆上分配实例,不管有没有客户调用。适用于程序中确定肯定会使用到该实例的情况。
class Singleton{public: static Singleton* GetInstance() { return m_instance; }private: Singleton(){}; Singleton(const Singleton &); Singleton & operator = (const Singleton &); static Singleton *m_instance; static Mutex m_mutex;}Mutex Singleton::m_mutex;Singleton* Singleton::m_instance = new Singleton;
第四种:线程一次性初始化
按陈硕提出的使用Linux下phtread_once线程函数实现,该线程函数的回调在程序的生命周期只会执行一次,利用该线程函数的回调实现初始化,比上面提到的任何一种方法都要高效,而且代码简洁。缺点是不能跨平台。
class Singleton{public: static Singleton* GetInstance() { phtread_once(&ponce, &Singleton::Init); return m_instance; }private: void Singleton():m_instance(NULL){}; static void Init() { m_instance = new Singleton; } static Singleton *m_instance; static pthread_once_t ponce;}Singleton* Singleton::m_instance = NULL;pthread_once_t Singleton::ponce;
设计模式之(Singleton)模式的几种实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。