目录
简介
懒汉式
饿汉式
简介
单例模式,通过创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例)
自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
实现方式
1.将默认构造函数设为私有,防止其他对象使用单例类的new运算符
2.新建一个静态构造方法作为构造函数。该函数调用私有构造函数来创建对象,并将其保存在一个静态成员变量中。此后所有对于该函数的调用都将返回这一缓存对象。
优点
1.可以保证一个类只有一个实例
2.获得了一个指向该实例的全局访问点
3.仅在首次请求单例对象时对其进行初始化
缺点
1.违反了单一职责原则。
2.多线程避免多次创建单例对象。
懒汉式
需要的时候才会创建
1.线程不安全,如果两个线程同时调用getsinstance的话,第一个被创建的会被第二个覆盖,并且第一个申请的空间没有释放,造成内存泄漏。
#include#include #include using namespace std; class Singleton { public: static Singleton* GetInstance() { if (instance_ == nullptr) instance_ = new Singleton(); return instance_; } private: Singleton(){} static Singleton* instance_; }; Singleton* Singleton::instance_ = nullptr; int main() { Singleton* s1 = Singleton::GetInstance(); Singleton* s2 = Singleton::GetInstance(); cout << "s1的地址" << (int)s1 << endl; cout << "s2的地址" << (int)s2 << endl; return 0; }
2.线程安全,进行加锁
#include#include #include using namespace std; class Singleton { public: static Singleton* GetInstance() { if (instance_ == nullptr) { m_mutex.lock(); if(instance_==nullptr) instance_ = new Singleton(); m_mutex.unlock(); } return instance_; } private: Singleton(){} static Singleton* instance_; static mutex m_mutex; }; Singleton* Singleton::instance_ = nullptr; mutex Singleton::m_mutex; int main() { Singleton* s1 = Singleton::GetInstance(); Singleton* s2 = Singleton::GetInstance(); cout << "s1的地址" << (int)s1 << endl; cout << "s2的地址" << (int)s2 << endl; return 0; }
饿汉式
一开始就创建好了,以后不再改变天生是线程安全的
#include#include #include using namespace std; class Singleton { public: static Singleton* GetInstance() { return instance_; } private: Singleton(){} static Singleton* instance_; static mutex m_mutex; }; Singleton* Singleton::instance_ = new Singleton(); int main() { Singleton* s1 = Singleton::GetInstance(); Singleton* s2 = Singleton::GetInstance(); cout << "s1的地址" << (int)s1 << endl; cout << "s2的地址" << (int)s2 << endl; return 0; }



