36、不一样的C++系列--单例类模板
来源:互联网 发布:网络错误651怎么解决 编辑:程序博客网 时间:2024/06/04 21:01
单例类模板
对于单例模式,我们都已经很熟悉了,这里我们来亲手制作一个单例类模板:
- 目标:某些类在整个系统生命期中最多只能有一个对象存在(Single Instance)
- 要控制类的对象数目,必须对外隐藏构造函数
- 思路:
- 将构造函数的访问属性设置为private
- 定义instance并初始化为NULL
- 当需要使用对象时,访问instance的值
- 空值:创建对象,并用instance标记
- 非空值:返回instance标记的对象
代码为下:
#include <iostream>#include <string>using namespace std;class SObject{ //定一个指针 static SObject* c_instance; SObject(const SObject&); SObject& operator= (const SObject&); SObject() { }public: static SObject* GetInstance(); void print() { cout << "this = " << this << endl; }};//初始化指针SObject* SObject::c_instance = NULL;//初始化的时候判断这个指针是否指空SObject* SObject::GetInstance(){ if( c_instance == NULL ) { c_instance = new SObject(); } return c_instance;}int main(){ SObject* s = SObject::GetInstance(); SObject* s1 = SObject::GetInstance(); SObject* s2 = SObject::GetInstance(); s->print(); s1->print(); s2->print(); return 0;}
运行结果为:
this = 0x7ff9a2c02680this = 0x7ff9a2c02680this = 0x7ff9a2c02680
虽然实现了需求,但是也存在了几个问题:
- 需要使用单例模式时:
- 必须定义静态成员变量 c_instance
- 必须定义静态成员函数GetInstance( )
- 解决方案
- 将单例模式相关的代码抽取出来,开发单例类模块。当需要单例类时,直接使用单例类模板。
再来写一个示例:
Singleton.h类
#ifndef _SINGLETON_H_#define _SINGLETON_H_template< typename T >class Singleton{ static T* c_instance;public: static T* GetInstance();};template< typename T >T* Singleton<T>::c_instance = NULL;template< typename T >T* Singleton<T>::GetInstance(){ if( c_instance == NULL ) { c_instance = new T(); } return c_instance;}#endif
调用类:
#include <iostream>#include <string>#include "Singleton.h"using namespace std;class SObject{ //使用友元 friend class Singleton<SObject>; // 当前类需要使用单例模式 SObject(const SObject&); SObject& operator= (const SObject&); SObject() { }public: void print() { cout << "this = " << this << endl; }};int main(){ SObject* s = Singleton<SObject>::GetInstance(); SObject* s1 = Singleton<SObject>::GetInstance(); SObject* s2 = Singleton<SObject>::GetInstance(); s->print(); s1->print(); s2->print(); return 0;}
运行结果为:
this = 0x7fc241402680this = 0x7fc241402680this = 0x7fc241402680
阅读全文
0 0
- 36、不一样的C++系列--单例类模板
- 32、不一样的C++系列--函数模板
- 33、不一样的C++系列--类模板与特化
- 34、不一样的C++系列--数组类模板
- 不一样的C++系列--类模板与特化
- 1、不一样的C++系列--C到C++的升级
- 37、不一样的C++系列--C语言异常处理
- Objective C 不一样的语法
- 1 不一样的 C 基础
- 不一样的C语言-变量
- 5、不一样的C++系列--函数重载
- 8、不一样的C++系列--面向对象
- 12、不一样的C++系列--初始化列表
- 14、不一样的C++系列--对象销毁
- 15、不一样的C++系列--临时变量
- 17、不一样的C++系列--静态成员
- 19、不一样的C++系列--友元
- 23、不一样的C++系列--智能指针
- hdu2648
- StreamingResponseBody-处理Servlet异步I/O请求
- 什么是晶圆CMP的ILD?
- CH340芯片选型----包括串口并口芯片
- 电路板线路板PCB开发设计分享教程之(2)--系统规划
- 36、不一样的C++系列--单例类模板
- php----stream_socket_pair
- java的继承
- 鸟哥Linux学习之——关机与重启
- Golang简单的memcache实现
- 删除C语言程序中所有的注释语句(有疑问)
- 学习C语言的第一天
- Angular4中调用js代码
- java语言基础(76)——集合框架(Map集合)