Singleton模式

时间:2022-01-08 17:51:34

Singleton模式的特点:

  • 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
    • 定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类操作(C++中的一个静态成员函数)。
  • 和全局变量相比:
    • 编译器不保证全局变量的初始化顺序;
    • 全局变量不能防止实例化多个对象。

一、指针实现方式

  1. //Singleton.h
  2. class Singleton
  3. {
  4. public:
  5. static Singleton* Instance();
  6. protected:
  7. Singleton();
  8. private:
  9. static Singleton* _instance;
  10. };
  11. //Singleton.cpp
  12. Singleton* Singleton::_instance = 0;
  13. Singleton::Singleton()
  14. {
  15. cout << "Singleton...." << endl;
  16. }
  17. Singleton* Singleton::Instance()
  18. {
  19. if (_instance == 0)
  20. {
  21. _instance = new Singleton();
  22. }
  23. return _instance;
  24. }
  25. //main.cpp
  26. #include "Singleton.h"
  27. int main()
  28. {
  29. Singleton* sgn = Singleton::Instance();
  30. //sgn->...
  31. }
//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》一书中给出的。

  1. //GameSoundMgr.h
  2. class GameSoundMgr
  3. {
  4. public:
  5. static GameSoundMgr& GetInstance();
  6. protected:
  7. GameSoundMgr();
  8. GameSoundMgr(const GameSoundMgr&);
  9. GameSoundMgr& operator=(const GameSoundMgr&);
  10. ~GameSoundMgr();
  11. };
  12. //GameSoundMgr.cpp
  13. GameSoundMgr& GameSoundMgr::GetInstance()
  14. {
  15. static GameSoundMgr tGameSoundMgr;
  16. return tGameSoundMgr;
  17. }
//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。

  1. //SingletonHolder.h
  2. template<class MyClass>
  3. class SingletoHolder
  4. {
  5. public:
  6. static MyClass& GetInstance();
  7. };
  8. //SingletonHolder.cpp
  9. #include "SingletonHolder.h"
  10. MyClass& SingletonHolder::GetInstance()
  11. {
  12. static MyClass tMyClass;
  13. return tMyClass;
  14. }
  15. //class GameSoundSystem;
  16. typedef SingletonHolder<GameSoundSystem> SingleSoundSytem;
  17. 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模式的更多相关文章

  1. Qt 中使用Singleton模式需小心

    在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...

  2. 剑指Offer面试题:1&period;实现Singleton模式

    说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...

  3. C&plus;&plus; Singleton模式

    地址:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却 ...

  4. Singleton模式——对象创建型模式

    Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...

  5. Singleton模式和Mono-State模式

    类和实例 对于大多数的类,都可以创建多个实例.在需要和不需要时,创建和删除这些实例.该过程会伴随着内存的分配和归还. 同时,有一些类,应该仅有一个实例.该实例在程序启动/结束时被创建和删除. root ...

  6. 转:Singleton模式

    C++完美实现Singleton模式  转自:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html boost库的Singleton的实现 ...

  7. Objective-C的singleton模式

    最近因为在ios应用开发中,考虑到一些公共方法的封装使用,就决定使用单例模式的写法了..不知道,Object-c中的单例模式的写法是否和java中的写法是否有所区别?于是阿堂从网上一搜,发现“ Obj ...

  8. js中singleton模式解析及运用

    singleton模式,又名单例模式.顾名思义,就是只能实例化一次的类(javascript中没有真正的类,我们通常用函数来模拟类,习惯称之为"伪类").具体地说,singleto ...

  9. Singleton 模式

    个人认为 Singleton 模式是设计模式中最为简单.最为常见.最容易实现,也是最应该熟悉和掌握的模式.且不说公司企业在招聘的时候为了考察员工对设计的了解和把握,考的最多的就是 Singleton ...

随机推荐

  1. SQL Server会话KILL不掉,一直处于KILLED &sol;ROLLBACK状态情形浅析

    今天遇到一个很奇怪的情况,发现一个会话异常,这个会话只是在执行一个简单的存储过程,里面使用了链接服务器(Linked Server)查询另外一台服务器数据(存储过程里面没有任何显性事务.UPDATE. ...

  2. SyteLine实现字段过滤

    如果说某个下拉列表,想过滤某些选项,该怎样来做呢,在Infor Syteline实现起来是一件很容易的事情.如在Fixed Assets窗口中的Class Code的下拉列表中,如果不想"_ ...

  3. 分布式消息队列的使用kakfa

    作用: 1.系统解耦 2.通过消息可以减少系统的处理压力,做一个缓冲 3.原理基于生存者消费者的模式 4.两种场景:队列(端对端 一对一).主题(一对多,广播模式) 5.消息:header.body构 ...

  4. &lpar;转&rpar;苹果推送通知服务教程 Apple Push Notification Services Tutorial

    本文译自http://www.raywenderlich.com/.原文由iOS教程团队 Matthijs Hollemans 撰写,经原网站管理员授权本博翻译. 在iOS系统,考虑到手机电池电量,应 ...

  5. STM32实现HID和u盘复合设备

      USB设备可以定义一个复合设备,复合设备分两种,一种是一个设备多个配置,还有一种是一个配置多个接口,在本例中采用一个配置多个接口的方式 首先修改设备描述符,标准设备描述符和报告描述符都不需要修改, ...

  6. Nginx 返回响应过滤响应内容

    陶辉94课 过滤模块 从下到上顺序 ngx_http_proxy_module 模块 Syntax: proxy_ignore_headers field ...; Default: — Contex ...

  7. Docker GitLab镜像部署

    环境说明 系统环境: CentOS Linux release 7.4 docker Version: 18.03.1-ce 运行镜像 docker run --detach \ --hostname ...

  8. 重载i&plus;&plus;&comma;&plus;&plus;i操作符

    #include <iostream> using namespace std; class Time { public: Time(){min=;sec=;} Time(int m,in ...

  9. makefile 中的符号替换(&dollar;&commat;、&dollar;&Hat;、&dollar;&lt&semi;、&dollar;&quest;)

    Makefile  $@, $^, $< $@  表示目标文件$^  表示所有的依赖文件$<  表示第一个依赖文件$?  表示比目标还要新的依赖文件列表 如一个目录下有如下文件: $ ls ...

  10. springmvc中&commat;RequestMapping的使用

    通过RequestMapping注解可以定义不同的处理器映射规则. 1.1 URL路径映射 @RequestMapping(value="/item")或@RequestMappi ...