这两种方法都提到了使用模版:

(1) 参考文章:http://www.cnblogs.com/08shiyan/archive/2012/03/16/2399617.html

不同:

a. 该方法直接使用auto_ptr来释放指针所指资源; 但auto_ptr在C++11中被 unique_ptr 替代了;

b.将 Singleton类的构造和析构函数设为private型, 然后使用 friend 函数(宏定义,这里我给替换回来了)来访问这两个函数, 以构造和析构对象。

// Singleton.h  模版类
template <class T>
class Singleton
{
public:
static inline T* getInstance()
{
 if(pInstance.get() == 0)
          {
   pInstance.reset(new T);
  }
   return pInstance.get();
}
private:
Singleton(void){};
~Singleton(void){};
Singleton(const Singleton&){};
Singleton& operator=(const Singleton&){};
static auto_ptr<T> pInstance; // 静态成员变量
}; template<class T>
auto_ptr<T> Singleton<T>
::pInstance;// 静态成员变量初始化,需在class声明之外
//----------------------------------------------
// ServiceManager.h 使用模版 定义一个Singleton 模式的类
#include "Singleton.h"
#include <iostream>
using namespace Pattern;
class ServiceManager
{
public:
void Run()
{
std::cout<< "ServiceManger run!~~" << std::endl;
}
private:
ServiceManager(){}
~ServiceManager(){}
    ServiceManager(const ServiceManager& s){};
ServiceManager& operator=(const ServiceManager& s){};
    friend class auto_ptr<ServiceManager>; // 采用友元方式,使得可访问ServiceManager 类的 private的构造函数和析构函数, 使得该类ServiceManager成为Singleton模式
friend class Singleton<ServiceManager>;
};//--------------------------------------------------------------
// Test.cpp #include "ServiceManager.h"
int main(int argc, char* argv[])
{
Singleton<ServiceManager>::getInstance()->Run();
system("pause");
return ;
}

(2) 参考文章: http://www.cnblogs.com/hujian/archive/2010/12/15/1906503.html

不同:

a. 该方法在一个static的结构体的析构函数中释放指针所指资源; (有点麻烦,不如auto_ptr 简便)

b. 将 Singleton类的构造和析构函数设为protected型, 然后使用继承的方式来访问这两个函数, 以构造和析构对象。

#include <iostream>

template<typename T>
class Singleton2
{
private:
static T* pInstance; // 静态成员变量
typedef struct Singleton2_Term // 定义一个对象用于析构
{
~Singleton2_Term()
{
if (getInstance() != NULL)
{
delete getInstance();
getInstance() = NULL;
}
}
};
protected: // 可被子类访问
Singleton2(){}
~Singleton2(){}
Singleton2(const Singleton2& singleton){}
Singleton2& operator= (const Singleton2& singleton){}
public:
static T* &getInstance() // 加 & , 可以做左值
{
static Singleton2_Term term;
if (pInstance == NULL)
{
pInstance = new T();
}
return pInstance;
}
}; template<typename T>
T *Singleton2<T>::pInstance = NULL; //静态成员变量初始化, 在类声明之外
//------------------------------------------------
// ServiceManager2.h
#pragma once
#include "Singleton2.h"
class ServiceManager2 : public Singleton2<ServiceManager2> // 采用继承的方式
{ public:
void Run()
{
std::cout<< "ServiceManager2 run!~~" << std::endl;
}
private:
ServiceManager2(void){};
~ServiceManager2(void){};
ServiceManager2(const ServiceManager2& s){};
ServiceManager2& operator=(const ServiceManager2& s){};
   friend class Singleton2<ServiceManager2>; // 定义友元
}; //------------------------------------------------------- 

// Test.cpp 
#include "ServiceManager2.h" int main(int argc, char* argv[])
{
ServiceManager2::getInstance()->Run();
system("pause"); return ;
}

2. Singleton模式的更多相关文章

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

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

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

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

  3. C++ 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. Singleton模式

    Singleton模式的特点: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 定义一个Instance操作,允许客户访问它的唯一实例.Instance是一个类操作(C++中的一个静态成员函数 ...

  8. Objective-C的singleton模式

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

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

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

  10. Singleton 模式

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

随机推荐

  1. Git 版本控制工具使用介绍------Windows系统下使用

    Git 是用于 Linux内核开发的版本控制工具.与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持(wingeddevil注:这得分是用什 ...

  2. Delpoyment assembly

    遇见异常: java.lang.ClassNotFoundException: 原因:没有对tomcat进行依赖说明 解决: properties - Delpoyment assembly 将tom ...

  3. 如何解决eclipse上的Android程序“Please ensure that adb is correctly located at 'D:\eclipse\sdk\platform-tools\adb.exe' and can be executed.”小问题?

    首先,把运行的Android模拟器和eclipse一块儿关了, 然后win+R,cmd, 下面输入adb kill_server 再输入adb start_server 之后重新运行项目,不出意外的话 ...

  4. Ouath协议

    OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站.移动或桌面应用上存储的私密的资源(如用户个人信息.照片.视频.联系人列表),而无需将用户名和密码提供给第三方应用. ...

  5. frontpage 正则 查找与替换

    frontpage正则查找替换 frontpage查找用{}[不是() ]来匹配pattern, 并获取这一匹配 替换时匹配的字符用\1 \2 \3表示 第 N 个标记表达式 \N 在“替换”表达式中 ...

  6. ​ScrollView、ListView嵌套

    1.手动设置ListView高度 经过测试发现,在xml中直接指定ListView的高度,是可以解决这个问题的,但是ListView中的数据是可变的,实际高度还需要实际测量.于是手动代码设置ListV ...

  7. python自学笔记

    python自学笔记 python自学笔记 1.输出 2.输入 3.零碎 4.数据结构 4.1 list 类比于java中的数组 4.2 tuple 元祖 5.条件判断和循环 5.1 条件判断 5.2 ...

  8. Python django admin 替换表单控件

    测试版本: Python 2.7 Django 1.6.2 models.py from django.db import models class Article(models.Model): ti ...

  9. android布局2

    Android功能强大,界面华丽,但是众多的布局属性就害苦了开发者,下面这篇文章结合了网上不少资料. 第一类:属性值为true或false android:layout_centerHrizontal ...

  10. PHP文件类型检查类-比较全的

    在CSDN上淘来的一个文件类型的类,还不错,留下自己看! <? /** * 检证文件类型类 * * @author */ class FileTypeValidation { // 文件类型,不 ...