Singleton:单件模式
2018-02-04 08:26
148 查看
Singleton:单件模式
单件模式是一种用于确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享时的程序设计方法(根据实际情况,可能需要几个类实例)。在某些情况下,这种程序设计方法是很有用处的。
例如:
单件主要有以下几个要点:
① 构造函数、拷贝构造函数与=运算符重载这三个函数设置为private。这样就使得用户无法通过这三种方式构造类的实例对象
② 提供了一个getInstance()函数,用于唯一对象的获取。同时负责对象的第一次构造
用户使用时,直接调用getInstance()函数来获取实例即可。由于在析构函数中已经对创建的对象做了释放,所以无需关心释放问题。
但是,上面的单件类仅对单线程有效。若使用多线程,则可能出现重复创建的问题。
例如,线程1和线程2同时调用了get
4000
Instance()函数。由于此时单件对象尚未创建,二者就可能同时通过if
(_pFileHelper ==nullptr)这个判断,从而创建两份对象。
所以,对于多线程,需要加锁:
但是,这样意味着每次调用getInstance()都要进行一次加锁解锁。若线程较多且调用频繁,会造成大量线程阻塞。
考虑到加锁仅仅是为了防止重复创建,故最好不影响实例获取,所以修改如下:
这样,在多线程下也不会出现反复创建的问题了。
单件模式是一种用于确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享时的程序设计方法(根据实际情况,可能需要几个类实例)。在某些情况下,这种程序设计方法是很有用处的。
例如:
//.h文件 class FileHelper { private: FileHelper() {}; FileHelper(const FileHelper&) {}; FileHelper& operator=(const FileHelper &) {}; public: ~FileHelper(); static FileHelper* getInstance(); private: static FileHelper* _pFileHelper; };
//.cpp文件 FileHelper* FileHelper::_pFileHelper = nullptr; FileHelper::~FileHelper() { if (_pFileHelper) { delete (_pFileHelper); _pFileHelper = nullptr; } } FileHelper* FileHelper::getInstance() { if (_pFileHelper == nullptr) { _pFileHelper = new FileHelper; } return _pFileHelper; }
单件主要有以下几个要点:
① 构造函数、拷贝构造函数与=运算符重载这三个函数设置为private。这样就使得用户无法通过这三种方式构造类的实例对象
② 提供了一个getInstance()函数,用于唯一对象的获取。同时负责对象的第一次构造
用户使用时,直接调用getInstance()函数来获取实例即可。由于在析构函数中已经对创建的对象做了释放,所以无需关心释放问题。
但是,上面的单件类仅对单线程有效。若使用多线程,则可能出现重复创建的问题。
例如,线程1和线程2同时调用了get
4000
Instance()函数。由于此时单件对象尚未创建,二者就可能同时通过if
(_pFileHelper ==nullptr)这个判断,从而创建两份对象。
所以,对于多线程,需要加锁:
FileHelper* FileHelper::getInstance() { lock(); if (_pFileHelper == nullptr) { _pFileHelper = new FileHelper; } Unlock(); return _pFileHelper; }
但是,这样意味着每次调用getInstance()都要进行一次加锁解锁。若线程较多且调用频繁,会造成大量线程阻塞。
考虑到加锁仅仅是为了防止重复创建,故最好不影响实例获取,所以修改如下:
FileHelper* FileHelper::getInstance() { if (_pFileHelper == nullptr) { lock(); if (_pFileHelper == nullptr) { _pFileHelper = new FileHelper; } Unlock(); } return _pFileHelper; }
这样,在多线程下也不会出现反复创建的问题了。
相关文章推荐
- [MyBean-说明书]关于插件的单件模式(singleton),插件的共享模式
- singleton单件模式
- VB.NET Singleton模式 单件模式
- 设计模式(五)[单件(Singleton)模式]
- C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) 笔记
- C#面向对象设计模式:Singleton 单件(创建型模式)
- PHP 实现单件(singleton)模式
- 设计模式学习之单件模式(Singleton)
- OGRE的单件模式 Singleton
- JavaScript的OO特性:Singleton单件模式
- 创建型模式:Singleton(单件)
- 单件模式(Singleton)和锁定(lock)
- Singleton 单件模式
- Singleton 单件模式及其变体 Double-Checked Locking 双重检查锁模式
- 设计模式--创建型-SINGLETON(单件)
- C#面向对象设计模式学习笔记(1) - Singleton 单件模式(创建型模式)
- Design Pattern_Singleton(单件模式)和Double-Checked Locking(双重检查锁定)
- singleton 单件模式的实现
- 五种单件模式之Singleton的实现方法详解
- Singleton(单件)模式的两种实现方法