2. Singleton模式
这两种方法都提到了使用模版:
(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模式的更多相关文章
- Qt 中使用Singleton模式需小心
在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...
- 剑指Offer面试题:1.实现Singleton模式
说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...
- C++ Singleton模式
地址:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却 ...
- Singleton模式——对象创建型模式
Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...
- Singleton模式和Mono-State模式
类和实例 对于大多数的类,都可以创建多个实例.在需要和不需要时,创建和删除这些实例.该过程会伴随着内存的分配和归还. 同时,有一些类,应该仅有一个实例.该实例在程序启动/结束时被创建和删除. root ...
- 转:Singleton模式
C++完美实现Singleton模式 转自:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html boost库的Singleton的实现 ...
- Singleton模式
Singleton模式的特点: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 定义一个Instance操作,允许客户访问它的唯一实例.Instance是一个类操作(C++中的一个静态成员函数 ...
- Objective-C的singleton模式
最近因为在ios应用开发中,考虑到一些公共方法的封装使用,就决定使用单例模式的写法了..不知道,Object-c中的单例模式的写法是否和java中的写法是否有所区别?于是阿堂从网上一搜,发现“ Obj ...
- js中singleton模式解析及运用
singleton模式,又名单例模式.顾名思义,就是只能实例化一次的类(javascript中没有真正的类,我们通常用函数来模拟类,习惯称之为"伪类").具体地说,singleto ...
- Singleton 模式
个人认为 Singleton 模式是设计模式中最为简单.最为常见.最容易实现,也是最应该熟悉和掌握的模式.且不说公司企业在招聘的时候为了考察员工对设计的了解和把握,考的最多的就是 Singleton ...
随机推荐
- Struts2 Spring hibernate 整合示例 .
示例工具:MyEclipse 8.5.Tomcat 6.0.MySql 步骤: 1.创建一个WEB工程,命名为BookShop(名字自己取,此处为示例工程名): 2.导入struts2的核心jar包, ...
- 从零开始学习jQuery-------jQuery元素选择器(三)
下面我们来介绍一下jQuery元素选择器,在Web开发中我们最常用的操作是获取元素,然后对获取的元素进行一系列的操作,jQuery根据获取页面元素的不同,可以将jQuery选择器分为四大类:基本选择器 ...
- [转] shared_from_this 几个值得注意的地方
http://hi.baidu.com/cpuramdisk/item/7c2f8d77385e0f29d7a89cf0 shared_from_this()是enable_shared_from_t ...
- 使用APICloud设计物联网APP
0.前言 1).APP功能: 1.控制室内插座的开关. 2.查看室内实时温湿度和温湿度趋势. 3.控制小车的行走,小车摄像头的开启/关闭.移动. 4.查看摄像头监控画面,可拍照并追溯. 5.查看服务器 ...
- Centos6.3 配置yum 163源
1. 下载repo文件 下载地址:http://mirrors.163.com/.help/CentOS6-Base-163.repo 2. 备份并替换系统的repo文件[root@localh ...
- python环境准备
一.环境准备. 1.安装python3.5.2(勾选环境变量),python2.7.12 2.设置环境变量 (要求命令行输入python,进入python2命令行,打python3时,进入python ...
- Composite 组合模式
简介 <大话设计模式>一书中组合模式的定义为:将对象组合成[树]形结构以表示[部分-整体]的层次结构,组合模式使得用户对[单个对象]和对[组合对象]的使用具有一致性. ...
- 使用Javascript限制文本框只允许输入数字
很多时候需要用到限制文本框的数字输入,试过许多方法,都不太理想,遂决定自己实现一个来玩玩.曾经使用过的方法通过onkeydown事件来控制只允许数字: <input onkeydown=&quo ...
- 通同select便签实现简单的二级联动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 二维码生成Demo
在C#中直接引用ThoughtWorks.QRCode.dll 类, 下载 dll 类 http://file.111cn.net/download/2013/06/29/20120516165420 ...