bosthhe1 / cpushpush

0 stars 0 forks source link

设计模式 #50

Open bosthhe1 opened 1 year ago

bosthhe1 commented 1 year ago

由于计算机编程的水平高低不一,大佬为了管理规范,设计出23种设计模式,单例模式就是其中一种,单例模式是知道该进程生命周期结束,都只创建一份资源,所以单例模式不能存在拷贝构造和赋值,由于单例模式在一个进程中,只存在一份,所以一般写析构函数,而是进程结束后,自动还给系统。 单例魔兽又分为懒汉模式和饿汉模式 饿汉模式是main函数执行前就创建好的,优点是:简单。缺点是:无法控制初始化顺序(假如B单例模式是A单例模式基础上创建的,饿汉模式就不能控制先后创建)、有可能对象过大,程序启动时间长。 懒汉模式是在使用的时候才去创建,优点:可以控制初始化顺序、不占用程序启动资源,程序启动快。缺点:相对复杂

bosthhe1 commented 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();
bosthhe1 commented 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;
    }
    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();