单例模式可以说是所有23种设计模式中最为简单的一个,没有之一。其主要思想就是保证整个应用环境中,最多只会有一个对象的实例。类关系图参考如下:

在c++中,单例模式的实现,较为常用的实现方式一般为:

 namespace singleton
{
/**************************************************************************
* create : (jacc.kim) [5-17-2016]
* summary : 单例类
**************************************************************************/
Singleton* Singleton::ms_Instance = nullptr;
class Singleton
{
public:
~Singleton() {}
static Singleton* getInstance() {
if (nullptr == ms_Instance) {
ms_Instance = new (std::nothrow) Singleton();
}
return ms_Instance;
} static void freeInstance() {
if (nullptr != ms_Instance) {
delete ms_Instance;
ms_Instance = nullptr;
}
} private:
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete; static Singleton* ms_Instance; };//class Singleton }//namespace singleton

常用的单例模式编码结构参考

其实还可以利用模板实现更加通用的单例设计。此种方式又可分为"is-a"形式与"has-a"形式。参考代码如下(以下是先前基于cocos2d-x v3.7版本搭的一个游戏框架中使用的代码):

 #pragma once

 #include "Framework/Foundation/GFGlobalDefine.h"

 NSGF_BEGIN

 /******************************************************************************
* create : (jacc.kim) [8-18-2015]
* summary : class GFHaSingleton
******************************************************************************/
template<typename T>
class GFHaSingleton
{
public:
typedef T TSingletonClass; public:
static TSingletonClass* getInstance();
static void freeInstance(); ~GFHaSingleton() {} private:
static TSingletonClass* sm_Instance; private:
GFHaSingleton();
GFHaSingleton(const GFHaSingleton<T>&) DELETE_METHOD;
GFHaSingleton& operator=(const GFHaSingleton<T>&) DELETE_METHOD; };//class GFHaSingleton /******************************************************************************
* create : (jacc.kim) [8-18-2015]
* summary : class GFIaSingleton
******************************************************************************/
template<typename T>
class GFIaSingleton : public T
{
public:
typedef T TSingletonClass; public:
static GFIaSingleton* getInstance();
static void freeInstance(); virtual ~GFIaSingleton() {} private:
static TSingletonClass* sm_Instance; private:
GFIaSingleton();
GFIaSingleton(const GFIaSingleton<T>&) DELETE_METHOD;
GFIaSingleton& operator=(const GFIaSingleton<T>&) DELETE_METHOD; };//class GFIaSingleton NSGF_END #include "Framework/Foundation/GFSingletonTemplate.inl"

模板形式实现的单例模式编码参考

这种形式的单例使用将是非常方便的。例如:GFHaSingleton<YourClassName>::getInstance()->xxxxxxxx(........);

单例模式在实现应用中是十分频繁的,几乎任何一个项目都必需会用到该模式。值得注意的一点是:我们可以在设计上尽量避免不会产生多于一个的实例,但实际技术上,只要你想,总是有办法创建出多于一个的实例的,这样,例就不再是单例了。就比如前面的第一份参考代码中的 class Singleton; 类,从声明上看,确实只能是有一份实现。但我们可以利用一些高级技术手段创建出N份实例对象来。因此,我们所说的单例,只是在一定的约束下的单例,只是在设计上保证单例。(其实这样在实际项目中就足够了)。

最新文章

  1. SAX解析DOM4J的方法总结
  2. 【python】jiraAPI使用教程 自动创建jira问题单并置状态为OPEN
  3. When building php 5.3, if you get the following error:
  4. Oracle数据库的后备和恢复————关于检查点的一些知识
  5. 配置 Apache+php多端口多站点(转载)
  6. 10个国内外jQuery的CDN性能大比拼
  7. Thread create 创建进程
  8. 一模 (5) day2
  9. MVC之 自定义过滤器(Filter)
  10. C#算法基础之冒泡排序
  11. /Users/XX/Library/Developer/Xcode/DerivedData/XX.app/xxsdk.bundle Directory not empty
  12. C++vptr初始化时间
  13. sharepoint 2013 个人网站公共母板页路径地址
  14. Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势
  15. Java容器源码解析之——ArrayList
  16. uva10003 区间DP
  17. 区别samtools faid产生的.fai文件功能和bwa index 产生的四个文件的功能
  18. go语言面向对象编程之类型系统
  19. NDK时间测量
  20. axis2与cxf区别

热门文章

  1. POJ3041 Asteroids(二分图最大匹配)
  2. Jmeter安装设置
  3. King&#39;s Quest - poj 1904(强连通分量+外挂输入输出)
  4. C++ —— 类的基础
  5. PHP读取文件内容的三种方式
  6. jquery animate
  7. 安装redis,含安装步骤和安装中出现的详细错误分析
  8. ffmpeg错误隐藏框架分析
  9. SKTransition类
  10. duilib DirectUI库里面的一个简单的例子RichListDemo