持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
单例就是说他要求一个类只能有一个对象,所有对象对它的依赖相同,在使用的时候不需要每次都要重新声明,使用起来更为便捷。他还可以减少内存的开支,减少系统新能德开支,他是在启动的时候就直接产生的一个对象,一直使用到结束。
实现要点: 将析构函数设置为非public的权限
使用一个类静态成员 保存唯一的实例
实现一个public的静态方法 用于获取唯一的对象实例
懒汉式与饿汉式的区别: 懒汉式与饿汉式可由字面意思得知,懒汉式就是死到临头才去实例化类,而饿汉式则是怕饿着,提前存好,会在最开始的时候就对他进行实例化。两种方式按照需要来使用。
懒汉:在访问量较小时,采用懒汉实现。这是以时间换空间。 饿汉:由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。 在安全性上,饿汉式更为安全。
懒汉式
Namespace dan{
class CSingleton
{
public:
static CSingleton * GetInstance()
{
If(instance == nullptr )
Instance = new CSingleton;
return instance;
}
Private:
CSingleton() {}
static CSingleton* instance;
};
}
1.懒汉式不会进行初始化 用时间换空间
2.不能保证线程安全 可能在调用instance是创建出多个单例
3.可能存在内存泄漏
改进:
namespace dan
{
template //模板 将T用模板的形式传进去
class CSingleton
{
public:
static T* GetInstance()
{
If(instance == nullptr )
Instance = new T();
return instance.get();
}
Singleton(void){}
private:
Singleton(const Singleton&) =delete;//{} 拷贝构造和赋值重载删除掉
Singleton& operator= (const Singleton&) =delete;//{}
static T* instance;
};
template
T* Singleton:: instance = nullptr;//类外初始化
优化:
static std::shared_ptr GetInstance()
static std::shared_ptr instance;// 使用智能指针 解决析构问题 shared_ptr 可以在生命周期结束之后自动释放
饿汉式
class CSingleton
{
private:
CSingleton() {}
public:
static CSingleton * GetInstance()
{
static CSingleton instance;
return &instance;
}
};
设置析构函数为私有 只能释放堆区内存