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

(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. JPA事务回滚配置

    <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.or ...

  2. 修改tt模板让ADO.NET C# POCO Entity Generator With WCF Support 生成的实体类继承自定义基类

    折腾几天记载一下,由于项目实际需要,从edmx生成的实体类能自动继承自定义的基类,这个基类不是从edmx文件中添加的Entityobject. 利用ADO.NET C# POCO Entity Gen ...

  3. Jquery~$when_done_then的用法

    对于$.ajax请求来说,如果层级比较多,程序看起来会比较乱,而为了解决这种问题,才有了$when...done...fail...then的封装,它将$.ajax这嵌套结构转成了顺序平行的结果,向下 ...

  4. session在登录中的使用

    package action.exam; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com. ...

  5. GridView的初级使用

    使用GridView自带的分页功能,需要激发PageIndexChanging protected void gvNewsList_PageIndexChanging(object sender, G ...

  6. 全文索引--自定义chinese_lexer词典

    全文索引它的数据字典本来就是自己加密过的数据格式,只有翻译过来了,才可以修改.这样修改后再生成它自己的数据格式文件,覆盖掉原来的,就会将新添加的关键词加入进去了!! 以下操作是在Oracle服务器安装 ...

  7. bash shell学习-shell基础 (笔记)

    When you hoist the sails to cross the sea, you willride the wind and cleave the waves. "长风破浪会有时 ...

  8. jquery mobile listview列表属性(搜索自动填充检索效果)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  9. id 自增------删除数据后恢复到删除前自增id

    删除数据后,执行下面语句: ALTER TBALE TableName AUTO_INCREMENT=1 mysql删除比较 一.DROP drop  table tablename 绝招:删除内容和 ...

  10. javascript 判断是否是PC还是手机端

    function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = new Array("Android" ...