您的位置:首页 > 其它

设计一个类,我们只能生成该类的一个实例。

2016-05-02 13:47 447 查看
单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

(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;
}
结果:



本文出自 “liveyoung” 博客,转载请与作者联系!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: