Open bosthhe1 opened 1 year ago
template<class T>
class Singleton
{
private:
Singleton(T _val = T())
:val(_val)
{}
Singleton(const Singleton<T>& val) = delete;
Singleton<T>& operator=(const Singleton<T>& val) = delete;
public:
static Singleton<T>* ini()
{
if (init == nullptr)
{
lock_guard<mutex> lck(mtx);//防止多线程重入,造成内存泄露
if (init == nullptr)
{
Sleep(1);
init = new Singleton<T>(1);
}
}
return init;
}
void printf()
{
cout << init << endl;
}
private:
T val;
static Singleton<T>* init;//只存在一份,就只能使用static的变量来控制访问,可以是指针,也可以是引用,看个人习惯
static mutex mtx;
};
template<class T>
Singleton<T>* Singleton<T>::init = nullptr;
template<class T>
mutex Singleton<T>::mtx = mutex();
如果非要调用析构函数来析构变量,一般是使用的内部类的方式,在程序结束的时候,调用内部内的析构函数析构
template<class T>
class Singleton
{
private:
Singleton(T _val = T())
:val(_val)
{}
Singleton(const Singleton<T>& val) = delete;
Singleton<T>& operator=(const Singleton<T>& val) = delete;
public:
static Singleton<T>* ini()
{
if (init == nullptr)
{
lock_guard<mutex> lck(mtx);
if (init == nullptr)
{
Sleep(1);
init = new Singleton<T>(1);
}
}
return init;
}
void printf()
{
cout << init << endl;
}
class Garbo//创建内部类
{
~Garbo()
{
if (init)
delete init;
}
};
private:
static Garbo Garbo1;//在程序退出的时候,调用对象的析构函数,析构
private:
T val;
static Singleton<T>* init;
static mutex mtx;
};
template<class T>
Singleton<T>* Singleton<T>::init = nullptr;
template<class T>
mutex Singleton<T>::mtx = mutex();
由于计算机编程的水平高低不一,大佬为了管理规范,设计出23种设计模式,单例模式就是其中一种,单例模式是知道该进程生命周期结束,都只创建一份资源,所以单例模式不能存在拷贝构造和赋值,由于单例模式在一个进程中,只存在一份,所以一般写析构函数,而是进程结束后,自动还给系统。 单例魔兽又分为懒汉模式和饿汉模式 饿汉模式是main函数执行前就创建好的,优点是:简单。缺点是:无法控制初始化顺序(假如B单例模式是A单例模式基础上创建的,饿汉模式就不能控制先后创建)、有可能对象过大,程序启动时间长。 懒汉模式是在使用的时候才去创建,优点:可以控制初始化顺序、不占用程序启动资源,程序启动快。缺点:相对复杂