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

(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. Qt 学习之路:视图选择 (QItemSelectionModel)

    选择是视图中常用的一个操作.在列表.树或者表格中,通过鼠标点击可以选中某一项,被选中项会变成高亮或者反色.在 Qt 中,选择也是使用了一种模型.在 model/view 架构中,这种选择模型提供了一种 ...

  2. 这10篇 iOS 热文,你别错过哦

    <移动开发必读书单> 某一领域的技术人,在他的职业生涯中,一定有一些绕不过去的技术和非技术的知识.有的时候,靠自己摸索.到处偷师,倒也能掌握.但是,这些别人早就趟过去的坎,大多已经有了非常 ...

  3. Array数组基本案例:图书基本录入输出系统

    import java.util.Scanner; public class ArrayTest{ public static void main(String args[]){ Scanner sc ...

  4. java的通信机制

    通信机制无非就那几种:http访问.socket访问: http又分为:jsp.servlet.html,用的就是get和post方法 socket则可分为:tcp或者udp方式 从以上内容又衍生出其 ...

  5. Android(java)学习笔记230:服务(service)之绑定服务的细节

    绑定服务的细节 1. 如果onbind方法返回值是null,onServiceConnect方法就不会被调用: 2. 绑定的服务,在系统设置界面,正在运行条目是看不到的: 3. 绑定的服务,不求同时生 ...

  6. Manacher算法求回文半径

    http://wenku.baidu.com/link?url=WFI8QEEfzxng9jGCmWHoKn0JBuHNfhZ-tKTDMux34CeY8UNUwLVPeY5HA3TyoKU2XegX ...

  7. 关于svn获取获取文件时 Unable to connect to a repository at URL"https://..."执行上下文错误:参数错误

    错误提示: 下面的六种解决方案都未能解决: 1.不提示输入用户名和密码,不管重装多少次都一样. 2.TortoiseSVN的setting->Saved Data->Authenticat ...

  8. C#多线程lock解决数据同步

    1.代码实例: public class ThreadTest4 { public static void Init() { //多个线程修改同一个值,使用lock锁解决并发 ; i < ; i ...

  9. javadoc in archive eclipse.

    Open Windows -> Preferences. 2.Select jre from Installed JREs then hit Edit botton on the right. ...

  10. iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的区别及用途

    init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UIViewContro ...