前言:单例模式是设计模式中比较简单的一种,但是又因为简单常见在面试中又是经常出现的一个设计模式。所以必须要会啊。之前也只是会写线程不安全的单例模式。
单例模式:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。
1、懒汉模式
全局的单例实例在第一次被使用时构建。
class Singleton
{
private:
static Singleton* instance;
Singleton(){}
public:
static Singleton* getInstance();
};
Singleton* Singleton::getInstance()
{
if(NULL == instance)
{
Lock();//这里使用标准库或者其他第三方库(伪代码)
if(NULL == instance)
{
instance = new Singleton;
}
UnLock();
}
return instance;
}
Note:如果我们使用懒汉模式处理大量数据,性能会成为一个问题(因为使用了两次条件判断)
2、饿汉模式
无论是否调用该类的实例,都会创建一个该类的实例,然后通过接口返回该类的这个唯一实例。饿汉模式通过静态实例初始化保证线程安全(不需要加锁)。所以在需要考虑性能的时候,需要采用这种模式,可以避免频繁的锁争夺。
class Singleton
{
private:
static const Singleton* instance;
Singleton(){}
public:
static const Singleton* getInstance()
{
return instance;
}
};
const Singleton* Singleton::instance = new Singleton;
3、enum枚举
最后介绍的一种就是枚举,但是枚举这种方式只能在Java这种语言中才可以使用,在cpp中就不行;因为在Java中枚举是对象。具体的相关内容可以查阅相关资料