C++中的单例类模板
1,本节课讲述单例类模式,实现并抽取相关代码实现单例类模板,在以后开发工作 中,如果想要使用单例模式,那么直接使用今天开发的单例类模板就可以;
2,需求的提出:
1,在架构设计时,某些类在整个系统生命期中最多只能有一个对象存在 ( Single Instance );
1,如超市收银系统,由外观来说其由显示器、扫描枪、收款箱组成,这几部分都只有一个部件,用面向对象的思想来进行架构设计的话,扫描枪应该对应到代码里面的一个类,它应该用来创建对象,实际的硬件只有一个扫描枪,肯定要限制扫描枪对应的类只能创建一个对象;
2,这个时候单例模式的需求就出来了;
3,问题:
1,如何定义一个类,使得这个类最多只能创建一个对象?
4,单例模式:
1,要控制类的对象数目,必须对外隐藏构造函数;
1,要创建一个对象,必然要调用构造函数,因此可以控制构造函数的访问属性;
2,思路:
1,将构造函数的访问属性设置为 private;
1,外界就不能创建对象了;
2,定义 instance 并初始化为 NULL;
3,当需要使用对象时,访问 instance 的值;
1,空值:创建对象,并用 instance 标记;
2,非空值:返回 instance 标记的对象;
5,单例模式初探编程实验:
#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(); // this = 0x940a008
s1->print(); // this = 0x940a008
s2->print(); // this = 0x940a008 return ;
}
1,上述代码中并没有释放这个唯一的对象,这是因为单例模式所对应的对象在系统的生命周期中都是存在的,如果这个系统还在运行,就不需用释放它;
2,单例模式所得到的对象在整个系统运行过程中是绝对不释放的;
6,单例模式存在问题(这里做的是锦上添花的事,要求完美):
1,需要使用单例模式时:
1,必须定义静态成员变量 c_instance;
2,必须定义静态成员函数 GetInstance();
2,如果现在要开发超市收银系统,那么开发扫描枪对应的类需要用单例模式来实现,收款箱对应的类也要用单例模式来实现,这个时候就要写重复的静态成员变量和静态成员函数;
3,静态成员变量和静态成员函数和我们类的实际功能没有关系,这是单例模式的逻辑;
7,解决方案:
1,将单例模式相关的代码抽取出来,开发单例类模板,当需要单例类时,直接使用单例类模板;
8,单例类模板编程实验:
1,单例模式类模板 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
2,单例模式的使用:
#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(); // 0x9621008;
s1->print(); // 0x9621008;
s2->print(); // 0x9621008; return ;
}
3,使用单例类模板方法:
1,构建对象的函数全部私有化;
2,声明单例类模板为此类的友元(可以访问这个类);
4,此单例类模板在我们今后开发工作中都可以使用;
9,小结:
1,单例模式是开发中最常用的设计模式之一;
2,单例模式的应用使得一个类最多只有一个对象;
3,可以将单例模式相关的代码抽象成类模板;
4,需要使用单例模式的类直接使用单例类模板;
C++中的单例类模板的更多相关文章
- c++ 中的单例类模板的实现方法
1.什么是单例模式 在架构设计时,某些类在整个系统生命周期中最多只能有一个对象存在 ( Single Instance ).如超市收银系统,其外观主要由显示器(1个).扫描枪(1个).收款箱(1个)组 ...
- C++之单例类模板
单例类模板:一个类只能有一个对象,比如超市收银系统中清点物品的仪器只有一个 设计思路: 1.构造函数,拷贝构造函数必须设计为private,防止自己生成新的对象 2.且类的指针要设计为static类型 ...
- C++解析(27):数组、智能指针与单例类模板
0.目录 1.数组类模板 1.1 类模板高效率求和 1.2 数组类模板 1.3 堆数组类模板 2.智能指针类模板 2.1 使用智能指针 2.2 智能指针类模板 3.单例类模板 3.1 实现单例模式 3 ...
- 28.C++- 单例类模板(详解)
单例类 描述 指在整个系统生命期中,一个类最多只能有一个实例(instance)存在,使得该实例的唯一性(实例是指一个对象指针) , 比如:统计在线人数 在单例类里,又分为了懒汉式和饿汉式,它们的区 ...
- iOS中编写单例类的心得
单例 1.认识过的单例类有哪些: NSUserDefaults.NSNotificationCenter.NSFileManager.UIApplication 2.单例类 单例类某个类在代码编写时使 ...
- Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践
Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践 背景 很多开发者或者有经验的老手都会建议尽量不要用单例模式,这是有原因的. 单例模式是设计模式中最简单的也是大家通常最先接触的一种设计 ...
- [转]单例模式——C++实现自动释放单例类的实例
[转]单例模式——C++实现自动释放单例类的实例 http://www.cnblogs.com/wxxweb/archive/2011/04/15/2017088.html http://blog.s ...
- 单例类singleton自动释放
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- Java线程和多线程(五)——单例类中的线程安全
单例模式是最广泛使用的创建模式之一.在现实世界之中,诸如Databae的连接或者是企业信息系统(EIS)等,通常其创建都是受到限制的,应该尽量复用已存在对象而不是频繁创建销毁.为了达到这个目的,开发者 ...
随机推荐
- 【BZOJ4456】 [Zjoi2016]旅行者 / 【UOJ #184】 【ZJOI2016】旅行者
Description 小Y来到了一个新的城市旅行.她发现了这个城市的布局是网格状的,也就是有n条从东到西的道路和m条从南到北 的道路,这些道路两两相交形成n×m个路口 (i,j)(1≤i≤n,1≤j ...
- 如何将项目托管到Github上
将本地项目放到GitHub上托管并展示 传送门 利用Github Pages展示自己的项目 传送门 git Please tell me who you are解决方法 传送门 git config ...
- 分布式-信息方式-ActiveMQ的Message dispatch高级特性之(指针) Message cursors
Message dispatch高级特性之 Message cursors概述 ActiveMQ发送持久消息的典型处现方式是:当消息的消费者准备就绪时,消息发送系统把存储的 消息 ...
- Java程序,JVM之间的关系
java程序是跑在JVM上的,严格来讲,是跑在JVM实例上的.一个JVM实例其实就是JVM跑起来的进程,二者合起来称之为一个JAVA进程.各个JVM实例之间是相互隔离的. 每个java程序都运行于某个 ...
- Emacs Python 自动补全之 eglot
eglot 个人水平有限,自己的测试难免有不足甚至错误的地方.欢迎各位emacser 能前来留言交流. 首先eglot 是一个lsp-mode的集成环境.作者说这不仅仅是一个lsp工具.但是我从其说明 ...
- android 给控件使用自定义字体Typeface
第一步:将字体资源放在assets 资源文件夹下: 第二步:获取字体资源 Typeface mTf = Typeface.createFromAsset(c.getAssets(), "Op ...
- Ubuntu 16.04下安装sublime Text的插件
Sublime Text是什么: 它是一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受.相比于难于上手的Vim,浮肿沉重 ...
- django中的model 的unique_together(联合唯一)
unique_together解释 nique_together 这个元数据是非常重要的一个!它等同于数据库的联合约束! 举个例子,假设有一张用户表,保存有用户的姓名.出生日期.性别和籍贯等等信息.要 ...
- pip Fatal error in launcher: Unable to create process using '""'
如果你装了python2.7, python3.5, 在两个版本的兼容问题上折腾很久了, 通过修改环境变量, 能够出现下面的界面, 恭喜你, 暂时解决了一些问题, 哈哈
- 十九:jinja2之set和with语句定义变量
set jinja2模板内部可以用set定义变量,只要定义了这个变量,在后面的代码中都可以使用此变量 with 如果想让定义的变量只在部分作用域内有效,则不嫩更实用set,需使用with定义,with ...