您的位置:首页 > 编程语言 > C语言/C++

设计模式——单例模式(C++实现)

2016-07-21 13:06 357 查看

懒汉模式

懒汉模式是在类第一次被引用时,才会将自己实例化,它面临着多线程访问的安全性问题。

基本模式

class ClassName
{
private:
ClassName()
{ }
virtual ~ClassName()
{ }
static ClassName *singleton_;
public:
static ClassName *GetInstance()
{
if (singleton_ == NULL)
{
singleton_ = new ClassName();
}
return singleton_;
}

static void ReleaseInstance()
{
if (singleton_ != NULL)
{
delete singleton_;
singleton_ = NULL;
}
}
};
ClassName *ClassName::singleton_ = NULL;


线程安全

class ClassName
{
private:
ClassName()
{ }
virtual ~ClassName()
{ }
static ClassName *singleton_;
public:
static ClassName *GetInstance()
{
lock
{
if (singleton_ == NULL)
{
singleton_ = new ClassName();
}
}
return singleton_;
}

static void ReleaseInstance()
{
lock
{
if (singleton_ != NULL)
{
delete singleton_;
singleton_ = NULL;
}
}
}
};
ClassName *ClassName::singleton_ = NULL;


双重锁定

class ClassName
{
private:
ClassName()
{ }
virtual ~ClassName()
{ }
static ClassName *singleton_;
public:
static ClassName *GetInstance()
{
if (singleton_ == NULL)//若实例未创建,则加锁
{
lock
{
if (singleton_ == NULL)//第二次检查
{
singleton_ = new ClassName();
}
}
}
return singleton_;
}

static void ReleaseInstance()
{
if (singleton_ != NULL)
{
lock
{
if (singleton_ != NULL)//第二次检查
{
delete singleton_;
singleton_ = NULL;
}
}
}
}
};
ClassName *ClassName::singleton_ = NULL;


饿汉模式

饿汉模式是静态初始化的方式,它在自己被加载时就将自己实例化,需要提前占用系统资源,但不存在线程安全问题。

class ClassName
{
private:
ClassName()
{ }
virtual ~ClassName()
{ }
static ClassName *singleton_;
public:
static ClassName *GetInstance()
{
return singleton_;
}
static void ReleaseInstance()
{
if (singleton_ != NULL)
{
delete singleton_;
singleton_ = NULL;
}
}
};
ClassName *ClassName::singleton_ = new ClassName();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: