单列模式
定义:确保一个类只有一个实例,并提供一个访问它的全局访问点。
类型:创建型模式
实现要点:
1.私有的构造函数。
2.指向自己实例的私有静态引用。
3.以自己实例为返回值的静态公有接口。
单列模式根据实例化对象时机的不同又分为两种:一是饿汉式单列,二是懒汉式单列。
饿汉式单列:饿汉式单列在单列类被加载时候,就实例化一个对象交给自己的引用。
class Singleton
{
public:
static Singleton* getInstance(){
return singleton;
}
private:
Singleton();
private:
static Singleton* singleton;
};
Singleton* Singleton::singleton = new Singleton();
懒汉式单列:懒汉式在调用实例化方法的时候才会实例化对象。
class Singleton
{
public:
static Singleton* getInstance(){
if(singleton == nullptr)
{
singleton = new Singleton();
}
return singleton;
}
private:
Singleton();
private:
static Singleton* singleton;
};
单例模式优点:
1.在内存中只有一个对象,节省内存空间。
2.避免频繁的创建和销毁对象,可以提高性能。
3.避免对共享资源的多重占用。
4.可以全局访问。
使用场景:
1.要求生成唯一序列号的环境。
2.在整个项目中需要一个共享访问点或共享数据。
3.创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源。
4.需要定义大量的静态常量和静态方法的环境。
备注:
1.多线程下懒汉式是线程不安全的,解决办法:加锁。
class Singleton
{
public:
static Singleton* getInstance(){
if(singleton == nullptr)
{
QMutexLocker locker(&QMutex());
if(singleton == nullptr)
{//线程安全的懒汉模式
singleton = new Singleton();
}
}
return singleton;
}
private:
Singleton();
private:
static Singleton* singleton;
};
2.多线程下饿汉式是线程安全的。