单例模式是一种创建型设计模式,它确保类只有一个实例,并提供一个全局访问点来访问这个实例。
在单例模式中,类的构造函数被设为私有,这样外部代码就无法直接实例化该类。而是通过类的静态方法来获取类的唯一实例。如果该类的实例还不存在,则静态方法会创建一个新实例并返回,否则直接返回已经存在的实例。这样可以确保在整个应用程序中只有一个特定类的实例存在。
单例模式的特点:
- 单例类只有一个实例对象
- 类中有一个获取实例的静态方法,可以全局访问
主要解决:全局使用的类频繁的创建与销毁
优点:避免对资源的多重占用,在内存中只有一个实例,减少内存的开销,尤其是频繁的创建和销毁实例
单例模式分类
1. 懒汉式
系统运行中,实例并不存在,只有当需要使用该实例时,才会去创建并使用实例。这种方式要考虑线程安全。
c
#include<iostream>
using namespace sstd;
class SingleTonlazy
{
public://唯一public接口设置为静态,用户不许要创建对象
singleTonlazy* getInstance()
{
if(pSingleTonlazy == NULL)
{
pSingleTonlazy = new SingleTonlazy;
}
return pSingleTonlazy;
}
private:
SingleTonlazy()
{
}
private:
static SingleTonlazy* pSingleTonlazy;
};
SingleTonlazy* SingleTonlazy::pSingleTonlazy = NULL;//TestA类的外部初始化操作
int main()
{
SingleTonlazy::getInstance();
return 0;
}
2. 饿汉式
系统一运行,就初始化创建实例,当需要时,直接调用即可。这种方式本身就线程安全,没有多线程的线程安全问题
c
class SingletonHungry
{
public:
static SingletonHungry* getInstance()
{
return pSingleHungry;
}
private:
SingletonHungry()
{
cout<<"饿汉式构造函数被调用"<<endl;
}
private:
static SingletonHungry* pSingleHungry;
};
//类外部初始化时直接创造对象
SingletonHungry* SingletonHungry::pSingleHungry == new SingletonHungry;
int main()
{
SingletonHungry* pObject = SingletonHungry::getInstance();
return 0;
}