1.单例模式的概念
在架构设计时,某些类在整个系统生命期中最多只能有一个对象存在,如何定义一个类,使得这个类最多只能创建一个对象?
单例模式是一种常见的软件设计模式。它的核心结构只包含一个被称为单例的特殊类。它的目的是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
2.懒汉式:第一次用到类的实例的时候才回去实例化。?
构造函数声明为private或者protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作有一个public的类方法实现。
代码示例:赖汉式
class singleton //实现单例模式的类
{
private:
singleton(){} //私有的构造函数
static singleton* Instance;
public:
static singleton* GetInstance()
{
if (Instance == NULL) //判断是否第一调用
Instance = new singleton();
return Instance;
}
};
分析:
这个实现在单线程下是正确的,但在多线程情况下,如果两个线程同时首次调用GetInstance方法且同时检测到Instance是NULL,则两个线程会同时构造一个实例给Instance,这样就会发生错误。
解决办法:改进后的懒汉式,使用双重锁。
代码示例:使用双重锁的懒汉式。
class singleton //实现单例模式的类
{
private:
singleton(){} //私有的构造函数
static singleton* Instance;
public:
static singleton* GetInstance()
{
if (Instance == NULL) //判断是否第一调用
{
Lock(); //表示上锁的函数
if (Instance == NULL)
{
Instance = new singleton();
}
UnLock() //解锁函数
}
return Instance;
}
};
3.饿汉式:单例类定义的时候就进行实例化。
饿汉式的特点是一开始就加载了,如果说懒汉式是“时间换空间”,那么饿汉式就是“空间换时间”,因为一开始就创建了实例,所以每次用到的之后直接返回就好了。饿汉模式是线程安全的。
代码示例:饿汉式
class singleton //实现单例模式的类
{
private:
singleton() {} //私有的构造函数
public:
static singleton* GetInstance()
{
static singleton Instance;
return &Instance;
}
};
|