Singleton模式
Singleton模式的特点:
- 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
- 定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类操作(C++中的一个静态成员函数)。
- 和全局变量相比:
- 编译器不保证全局变量的初始化顺序;
- 全局变量不能防止实例化多个对象。
一、指针实现方式
- //Singleton.h
- class Singleton
- {
- public:
- static Singleton* Instance();
- protected:
- Singleton();
- private:
- static Singleton* _instance;
- };
- //Singleton.cpp
- Singleton* Singleton::_instance = 0;
- Singleton::Singleton()
- {
- cout << "Singleton...." << endl;
- }
- Singleton* Singleton::Instance()
- {
- if (_instance == 0)
- {
- _instance = new Singleton();
- }
- return _instance;
- }
- //main.cpp
- #include "Singleton.h"
- int main()
- {
- Singleton* sgn = Singleton::Instance();
- //sgn->...
- }
//Singleton.h
class Singleton
{
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton* _instance;
}; //Singleton.cpp
Singleton* Singleton::_instance = 0;
Singleton::Singleton()
{
cout << "Singleton...." << endl;
}
Singleton* Singleton::Instance()
{
if (_instance == 0)
{
_instance = new Singleton();
}
return _instance;
} //main.cpp
#include "Singleton.h"
int main()
{
Singleton* sgn = Singleton::Instance();
//sgn->...
}
这是Singleton最常见的一种实现方式。优缺点列举如下:
- 优点
- 对唯一实例的受控访问
- 缩小名空间:对全局变量的一种改进,避免了存储唯一实例的全局变量污染名空间。
- 缺点
- 返回的是指针,调用者有可能会delete掉
- Singleton占用的内存,何时会被释放?
二、引用实现方式
这种方式是《Modern C++ Design》一书中给出的。
- //GameSoundMgr.h
- class GameSoundMgr
- {
- public:
- static GameSoundMgr& GetInstance();
- protected:
- GameSoundMgr();
- GameSoundMgr(const GameSoundMgr&);
- GameSoundMgr& operator=(const GameSoundMgr&);
- ~GameSoundMgr();
- };
- //GameSoundMgr.cpp
- GameSoundMgr& GameSoundMgr::GetInstance()
- {
- static GameSoundMgr tGameSoundMgr;
- return tGameSoundMgr;
- }
//GameSoundMgr.h
class GameSoundMgr
{
public:
static GameSoundMgr& GetInstance();
protected:
GameSoundMgr();
GameSoundMgr(const GameSoundMgr&);
GameSoundMgr& operator=(const GameSoundMgr&);
~GameSoundMgr();
}; //GameSoundMgr.cpp
GameSoundMgr& GameSoundMgr::GetInstance()
{
static GameSoundMgr tGameSoundMgr;
return tGameSoundMgr;
}
其优缺点列举如下:
- 优点
- 构造/析构函数,拷贝构造函数,赋值函数等,都被限定为私有函数,可防止外部调用生成Singleton的副本
- 外部得到的是static局部变量的引用,不会删除对象
- 程序结束后,Singleton内存自动释放
- 缺点
- 即使不使用此Singleton,静态变量始终存在
三、Singleton Holder
在你的系统中,有可能要用到多个Singleton对象,比如一个国家,主席只能有一个,同样,国防部长也只能有一个,那怎么办呢?《Modern C++ Design》还给我们提供了一种Singleton Holder,通过template的应用,批量生产Singleton。
- //SingletonHolder.h
- template<class MyClass>
- class SingletoHolder
- {
- public:
- static MyClass& GetInstance();
- };
- //SingletonHolder.cpp
- #include "SingletonHolder.h"
- MyClass& SingletonHolder::GetInstance()
- {
- static MyClass tMyClass;
- return tMyClass;
- }
- //class GameSoundSystem;
- typedef SingletonHolder<GameSoundSystem> SingleSoundSytem;
- GameSoundSystem& mySoundSys = SingleSoundSytem ::GetInstance();
//SingletonHolder.h
template<class MyClass>
class SingletoHolder
{
public:
static MyClass& GetInstance();
}; //SingletonHolder.cpp
#include "SingletonHolder.h"
MyClass& SingletonHolder::GetInstance()
{
static MyClass tMyClass;
return tMyClass;
} //class GameSoundSystem;
typedef SingletonHolder<GameSoundSystem> SingleSoundSytem;
GameSoundSystem& mySoundSys = SingleSoundSytem ::GetInstance();
以上技术的详情,请参见《Modern C++ Design》一书。另外在我的博客另外一篇文章,也有一个logSingleton的小
Singleton模式的更多相关文章
- Qt 中使用Singleton模式需小心
在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...
- 剑指Offer面试题:1.实现Singleton模式
说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...
- C++ Singleton模式
地址:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却 ...
- Singleton模式——对象创建型模式
Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...
- Singleton模式和Mono-State模式
类和实例 对于大多数的类,都可以创建多个实例.在需要和不需要时,创建和删除这些实例.该过程会伴随着内存的分配和归还. 同时,有一些类,应该仅有一个实例.该实例在程序启动/结束时被创建和删除. root ...
- 转:Singleton模式
C++完美实现Singleton模式 转自:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html boost库的Singleton的实现 ...
- Objective-C的singleton模式
最近因为在ios应用开发中,考虑到一些公共方法的封装使用,就决定使用单例模式的写法了..不知道,Object-c中的单例模式的写法是否和java中的写法是否有所区别?于是阿堂从网上一搜,发现“ Obj ...
- js中singleton模式解析及运用
singleton模式,又名单例模式.顾名思义,就是只能实例化一次的类(javascript中没有真正的类,我们通常用函数来模拟类,习惯称之为"伪类").具体地说,singleto ...
- Singleton 模式
个人认为 Singleton 模式是设计模式中最为简单.最为常见.最容易实现,也是最应该熟悉和掌握的模式.且不说公司企业在招聘的时候为了考察员工对设计的了解和把握,考的最多的就是 Singleton ...
随机推荐
- 转:HashMap深度解析(一)
HashMap哈希码hashCodeequals 本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/16843543,转载 ...
- ulink 固件更新问题
1前言 ulink版本升级.. 当使用keil4.7.4版本时,ulink固件库更新了. 2官方资料解释: Boot Mode Utility Home » Appendix » Utilities ...
- comet
comet 1.简介: 基于 HTTP长连接的“服务器推”技术,是一种新的 Web 应用架构,基于这种架构开发的应用中,服务器端会主动以异步的方式向客户端程序推送数据,而不需要客户端显式的发出请求.C ...
- Java容器类接口:Iterator,Collection,Map
Iterator Iterator被称为迭代器,是一个对象,它的工作是遍历并选择序列中的对象,可以实现以下一些操作: 使用方法iterator()要求容器返回一个Iterator,Iterator将返 ...
- ACDream-C - Transformers' Mission(Dijastra最短路径)
dijstra求最短路径:经典应用题目: 题意:给你一个带权值无向图,权值是A点到B点的时间,然后告诉你起点,一个人可以去炸掉一个结点或多个节点,也可以派多个人,最终这些人在终点集合,问最后一个到达终 ...
- Linux下查看每个目录所占用空间大小的命令
cd到上级目录,然后输入一条命令即可查询每个子目录所占用的空间大小 du -h --max-depth=1 可以更改--max-depth参数的值,该参数表示查询子目录的层级,当前为1层
- socket() failed (13: Permission denied) while connecting to upstream
/*************************************************************************** * socket() failed (13: ...
- LeetCode Kth Largest Element in an Array (快速排序)
题意: 在一个无序的数组中第k大的数是多少? 思路: 按照快排的思路,如果每次分成两段后,设为L和R.如果R>=k ,则答案在右边集合,否则在左边集合. 这里用了3位取中法.注意快排别给写死循环 ...
- Python 新手常犯错误(第二部分)
转发自:http://blog.jobbole.com/43826/ 在之前几个月里,我教一些不了解Python的孩子来慢慢熟悉这门语言.渐渐地,我发现了一些几乎所有Python初学者都会犯的错误,所 ...
- Sqlserver 角色那些事
固定服务器角色 描述 sysadmin 可以在SQLServer 中执行任何活动. serveradmin 可以设置服务器范围的配置选项,关闭服务器. setupadmin 可以管理链接服务器和启动过 ...