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 ...
随机推荐
- Ubuntu下Qt项目的部署
部署涉及到以下内容: 1. 程序执行文件: 2. 动态链接库: 3. Qt的一些插件(plugins),例如图片插件(imageformats),数据库插件(sqldrivers): 4. 其他资源文 ...
- Hibernate分页
1. HQL分页: Session session = HibernateUtil.getInstance().getSession(); Query query = session.createQu ...
- msp
10月8号加入了微软的msp项目,其实那时候对msp没有什么概念,不知道要干嘛,真的觉得大不了就退出呗,反正也没啥大事, 现在再也不那么看了,这二十多天虽然没怎么水群,但是还是一直在关注着我们这个 ...
- configSections(配置文件)
转载:http://www.cnblogs.com/jhxk/articles/1609182.html 由于最近一个项目的数据库变动比较频繁, 为了减少数据层的负担, 打算采用.net的MVC框架, ...
- CSS中表示cellpadding和cellspacing的方法
本文和大家重点讨论一下用CSS来表示表格的cellpadding和cellspacing方法,表格的cellpadding和cellspacing我们经常会用一定的方式来清除默认样式,请看下文详细介绍 ...
- Android Studio使用教程图文详解
谷歌表示Android Studio 1.0 能让开发者“更快更有生产力”,并认为它可以代替 Eclipse,同时为Eclipse 用户提供迁移步骤.代码自动提示.运行响应速度.都比Eclipse来的 ...
- 解决 iOS View Controller Push/Pop 时的黑影
那么如何解决这个问题呢? 实际上很简单,如果这个 ViewController 是在 TabBarViewController 的 NavigationController 上 Push/Pop 的, ...
- hibernate_validator_02
三种不通的注解 1. 字段级(field level) 约束 package com.mycompany; import javax.validation.constraints.NotNull; p ...
- 你好,C++(32) 类是对现实世界的抽象和描述 6.2.1 类的声明和定义
6.2 类:当C++爱上面向对象 类这个概念是面向对象思想在C++中的具体体现:它既是封装的结果,同时也是继承和多态的载体.因此,要想学习C++中的面向对象程序设计,也就必须从“类”开始. 6.2. ...
- sae crop 文档
原文是google缓存:http://webcache.googleusercontent.com/search?q=cache:MD_FP-G6RI8J:sae.sina.com.cn/%3Fm%3 ...