设计模式之单例模式:饿汉模式(懒汉模式)及优缺点分析

单例类并不是一定要用一个固定的名字

如果保证全局(一个进程中)只有唯一实例对象

构造函数私有定义。拷贝构造和赋值防拷贝直接禁用

提供一个GetInstance获取单例对象

//饿汉模式  ----程序开始main执行之前就创建单例对象

//提供一个静态指向单例对象的成员指针,初始化时new一个对象给它

class Singleton

{

public:

    static Singleton* GetInstance(){   //获取实例   静态成员函数

    //无this指针  只能访问静态的成员变量

    return _inset;

    }

private:

    singleton()

    {}

    singleton(const singleton&) = delete;

    singleton& operator=(const Singleton&) = delete;

    static Singleton* _inset;

};

Singleton* Singleton::_inset=new Singleton;

int main(){      //静态的在main函数之前就已经初始化完成

    cout<

    cout<

    cout<

    return 0;

}


 

//假设单例类构造函数中,要做很多配置初始化工作,那么饿汉就不合适了。

//导致程序启动非常慢     迟迟进不了main函数

//懒汉模式      一开始不创建对象  开始用的时候才创建对象   (GetInstance在多线程时  是不安全的)

class Singleton

public:

    static Singleton* GetInstance(){   //获取实例   静态成员函数

    //无this指针  只能访问静态的成员变量

    //多线程中  保护第一次需要加锁  后面都不需要加锁的场景   可以使用双检查加锁

    //特点:第一次加锁  后面不加锁  保护了线程安全  同时提高了效率

    if(_inset == nullptr)

    {

    _mtx.lock()

    if(_inset==nullptr){            //只有第一次为空  只有第一次会写入数据 也就是第一次加锁有意义

        _inset = new Singleton;//在程序当中 不会影响程序的启动初始化

    }

    _mtx.unlock();

    }

    return _inset;

    }

private:

    singleton()

    {}

    singleton(const singleton&) = delete;

    singleton& operator=(const Singleton&) = delete;

    static Singleton* _inset;

    static std::mutex _mtx;

};

//单例对象  一般不需要考虑释放     不会存在内存泄漏


 

Singleton* Singleton::_inset=nullptr;

std::mutex Singleto::_mtx;

int main(){      //静态的在main函数之前就已经初始化完成

    cout<

    cout<

    cout<

    return 0;

}

//懒汉模式和饿汉模式的对比

//饿汉  优点:简单    缺点:如果单例对象构造函数工作比较多,会导致程序启动慢,迟迟进不了入口main函数

                          如果有多个单例对象,他们之间有初始化依赖关系,饿汉模式也会有问题

                        比如有A和B两个单例类    要求A单例先初始化   B必须在A之后初始化  则饿汉无法保证

                        这种场景下用懒汉就可以    懒汉可以先调用A::GetInstance(),再调用B::GetInstance().

//懒汉  优点:解决上面饿汉的缺点,  因为他是第一次调用GetInstance时创建初始化单例对象

        缺点:比饿汉复杂一点点

单例对象在静态区   如果单例对象太大,不太好,不合适。

向主动释放单例对象    不太好释放

你可能感兴趣的:(单例模式,java,开发语言)