第六十二课、单例类模板
一、单例模式(一个类只有一个对象,且单例模式一般不用释放)
1、要控制类的对象数目,必须对外隐藏构造函数
(1)、将构造函数的访问属性设置为private
(2)、定义instance并初始化为NULL
(3)、当需要使用对象时,访问instance的值
A、空值:创建对象,并用instance标记
B、非空值:返回instance标记的对象
#include<iostream>using namespace std;class Object {static Object* c_instance;//c_instance用来记录对象Object();//隐藏构造函数、拷贝构造函数、赋值操作符Object(const Object& obj);Object& operator = (const Object& obj);public: static Object* GetInstance();void print(); };Object* Object::c_instance = NULL;Object::Object() { }Object* Object::GetInstance() {if(c_instance == NULL){c_instance = new Object();}return c_instance; }void Object::print() {cout << c_instance << endl; }int main() {Object* p1 = Object::GetInstance();Object* p2 = Object::GetInstance();Object* p3 = Object::GetInstance();p1->print();p2->print();p3->print();//最后三个值都一样,说明指向同一个对象return 0; }
二、存在的问题及解决方法
1、存在的问题
(1)、必须定义静态成员变量m_instance
(2)、必须定义静态成员函数GetInstance
2、解决方法
(1)、将单例模式相关的代码抽取出来,开发单例类模板
(2)、当需要单例时,直接使用单例类模板
#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"Singleton.h"using namespace std;class Test { friend class Singleton<Test>;//说明这个类要使用单例模式Test(){};//记得定义构造函数Test(const Test& obj);Test& operator = (const Test& obj); public:void print(){cout << "this = " << this << endl;} };int main() {Test* p1 = Singleton<Test>::GetInstance();Test* p2 = Singleton<Test>::GetInstance();Test* p3 = Singleton<Test>::GetInstance();p1->print();p2->print();p3->print();return 0; }
三、小结
(1)、单例模式是开发中最常用的设计模式之一
(2)、单例模式的应用使得一个类最多只有一个对象
(3)、可以将单例模式相关的代码抽象成类模板
(4)、需要使用单例模式的类直接使用单例类模板
转载于:https://www.cnblogs.com/gui-lin/p/6378716.html
第六十二课、单例类模板相关推荐
- 单例模式及单例类的两种实现
单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在 ...
- 第十二课 Java基础篇——面向对象进阶(一)
一.Static static表示静态,是Java中的一个修饰符,可以修饰成员方法,成员变量 静态变量是随着类的加载而加载的,优先于对象出现的 练习1.定义数组工具类 需求:在实际开发中,经常会遇到一 ...
- C#之windows桌面软件第十二课:电脑ADC值显示(上位机),记忆上次串口号,并用TrackBar控件显示ADC值
C#之windows桌面软件第十二课:电脑ADC值显示(上位机),记忆上次串口号,并用TrackBar控件显示ADC值 using System; using System.Collections.G ...
- 面渣逆袭:三万字,七十图,详解计算机网络六十二问(收藏版)
大家好,我是老三,开工大吉,虎年第一篇,面渣逆袭系列继续! 这次给大家带来了计算机网络六十二问,三万字,七十图详解,大概是全网最全的网络面试题. 建议大家收藏了慢慢看,新的一年一定能够跳槽加薪,虎年& ...
- 面渣逆袭:计算机网络六十二问,三万字图文详解!速收藏!
这次给大家带来了计算机网络六十二问,三万字,七十图详解,大概是全网最全的网络面试题. 基础 1.说下计算机网络体系结构 计算机网络体系结构,一般有三种:OSI 七层模型.TCP/IP 四层模型.五层结 ...
- 【正点原子Linux连载】第六十二章 Linux SPI驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 【C++探索之旅】第一部分第十二课:指针一出,谁与争锋
内容简介 1.第一部分第十二课:指针一出,谁与争锋 2.第一部分第十三课预告:第一部分小测验 指针一出,谁与争锋 上一课<[C++探索之旅]第一部分第十一课:小练习,猜单词>中,我们用一个 ...
- (七)boost库之单例类
一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问 ...
- java中单例设计模式登记式单例类_java23种设计模式-创建型模式之单例模式
单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...
最新文章
- AI领域「听风者」:声纹识别5大核心知识点!
- 图像的打开、修改、显示和保存示例(OpenCV 2.0)
- python库整理:os
- 区块链学堂(5):Geth 安装
- python3随笔-相关系数
- powershell 遍历json_使用PowerShell处理JSON字符串
- 在Java中调用祖父母方法:您不能
- nginx(windows环境安装)
- nginx access.log 忽略favicon.ico訪问记录的方法
- win10系统下安装基于虚拟机的32位XP系统
- matlab逐步线性回归分析法,[转载]matlab 回归分析
- 面试重点:starter原理以及自己动手实现一个starter
- android手表微信运动,oppo智能手表微信运动如何安装
- linux的系统监视器图片_用Jetson Nano构建一个价值60美元的人脸识别系统
- 瑞格科技IPO被终止:曾拟募资5.6亿 江振翔三兄弟为实控人
- 论IE8浏览器报错:$未定义及缺少对象问题
- 华为g9青春版连接计算机,一键式访问华为G9和USB驱动程序
- 你可以忍受大城市 365 天的孤独,却不能忍受小城市 7 天的热闹
- c语言中源文件未编译是什么,源文件未编译什么意思
- cropper截图插件(自定义像素的图片并保存本地)