单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。 从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。 (1)这种方法只适用单线程。 #include<iostream> #include<stdlib.h> using namespace std; class Csingleton { private: Csingleton()//构造函数私有化 { cout<<"Csingleton()"<<endl; } static Csingleton* m_pInstance; public: static Csingleton* GetInstance() { //判断是否是第一次调用 if(m_pInstance==NULL) { m_pInstance= new Csingleton(); } return m_pInstance; } }; Csingleton* Csingleton::m_pInstance=NULL; void test() { Csingleton* c=Csingleton::GetInstance(); Csingleton* s=Csingleton::GetInstance(); } int main() { test(); system("pause"); return 0; }
(2)多线程,当Csingleton还没有创建出来时,需要加把锁;当Csingleton创建出来之后,无需加锁。
#include<iostream> #include<stdlib.h> using namespace std; class Csingleton { private: Csingleton()//构造函数私有化 { cout<<"Csingleton()"<<endl; } static Csingleton* m_pInstance; public: static Csingleton* GetInstance() { //判断是否是第一次调用 if(m_pInstance==NULL) { /*lock(syncObj);*/ m_pInstance= new Csingleton(); } return m_pInstance; } }; Csingleton* Csingleton::m_pInstance=NULL; void test() { Csingleton* c=Csingleton::GetInstance(); Csingleton* s=Csingleton::GetInstance(); } int main() { test(); system("pause"); return 0; }
(3)利用静态构造函数,初始化静态变量的时候创建实例。
#include<iostream> #include<stdlib.h> using namespace std; class Csingleton { private: Csingleton()//构造函数私有化 { cout<<"Csingleton()"<<endl; } private: static Csingleton* m_pInstance=new Csingleton(); public: static Csingleton* GetInstance() { return m_pInstance; } }; void test() { Csingleton* c=Csingleton::GetInstance(); Csingleton* s=Csingleton::GetInstance(); } int main() { test(); system("pause"); return 0; }
结果:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。