只能生成一个实例的类是实现了Singelton(单例)模式的类型。类是通过构造函数创建实例的,所以要把构造函数设为私有函数,以禁止其他人创建实例。本文提供了几种方式:经典懒汉式、经典饿汉式、多线程式。
#include<iostream>
#include<string>
using namespace std;
<pre class="cpp" name="code"><strong><span style="font-size:14px;">//1.经典懒汉式:懒汉式的特点是延迟加载,实例直到用到的时候才会加载。
//只适用于单线程的情况</span>。</strong>
class SingelTon{
private:
SingelTon(){}//构造函数
static SingelTon*instance;//SingelTon的静态属性instance。
public:
static SingelTon*getInstance()
{
if(instance==NULL)
instance=new SingelTon();//只有在instance为null时才会创建实例,避免重复创建。
return instance;
}
};
/*
但是该方法有一定的问题,会存在内存泄漏的问题,new出来的东西始终没有释放。*/
<span style="font-size:14px;"><strong>//2.经典饿汉式饿汉式的特点是一开始就加载了,如果说懒汉式是“时间换空间”,那么饿汉式就是“空间换时间”,因为一开始就创建了实例,所以每次用到的之后直接返回就好了。
//只适用于单线程的情况。
</strong></span>class SingelTon{
private:
SingelTon(){}//构造函数
public:
static SingelTon*getInstance()
{
/*
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,
以后不再改变,懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。
*/
static SingelTon instance;
return & instance;
}
};
<strong><span style="font-size:14px;">//3. 多线程。
//加上同步锁前后两次判断实例是否存在。</span></strong>
class SingelTon{
private:
SingelTon(){}//构造函数
static SingelTon*instance;//SingelTon的静态属性instance。
public:
static SingelTon*getInstance()
{
if(instance==NULL)
{
Lock();//借用其它类来实现,如boost. 此处代码需要自己实现
if(instance==NULL)
instance=new SingelTon();
Unlock();
}
return instance;
}
};