当前位置: 首页 > 编程日记 > 正文

设计模式(4)-序列生成器之单例模式

场景:序列生成器

系统中统一的序列生成程序,整个系统统一一套!那么就用单例模式吧!

首先看看单例模式

1)类持有一个自己的实例,而且还是个静态实例。

2)类的构造函数为私有属性。

3)用以获得实例的方法为静态方法。

看看类图

2011041320233414.jpg

然后看一段试例程序:

#include <iostream>using namespace std;class Singleton{
private:   Singleton();//注意:构造方法私有   virtual ~Singleton();   static Singleton* instance;//惟一实例   int var;//成员变量(用于测试)   
public:   static Singleton* GetInstance();//工厂方法(用来获得实例)   int getVar();//获得var的值   void setVar(int);//设置var的值 
};
//构造方法实现 
Singleton::Singleton()   
{   this->var = 20;   cout<<"Singleton Constructor"<<endl;   
} 
Singleton::~Singleton()
{if(instance != NULL){delete instance;}
}
//初始化静态成员   
//Singleton* Singleton::instance=new Singleton();  
Singleton* Singleton::instance=NULL;
Singleton* Singleton::GetInstance()   
{   if(instance == NULL){instance = new Singleton();}return instance;   
}   
//seter && getter含数   
int Singleton::getVar()   
{   return this->var;   
}   
void Singleton::setVar(int var)   
{   this->var = var;   
}   int main(int argc, char* argv[])
{Singleton *ton1 = Singleton::GetInstance();Singleton *ton2 = Singleton::GetInstance();cout<<"ton1 var = "<<ton1->getVar()<<endl;   ton1->setVar(150);  cout<<"ton2 var = "<<ton2->getVar()<<endl;return 0;
}

1、构造方法私有

那么,就意味着,只能在Singleton的成员函数中,才能调用Singleton的构造函数来创建实例。在Singleton之外,不能创建Singleton对象的实例。

2、代码中,定义了GetInstance方法,只能通过GetInstance方法来获取Singleton对象的实例,单例就是在GetInstance方法中控制的。

首先,Singleton有一个
static Singleton* instance;//惟一实例

Singleton* Singleton::instance=NULL;
在这里初始化为NULL。

Singleton* Singleton::GetInstance()  
{  
 if(instance == NULL)
 {
  instance = new Singleton();
 }
 return instance;  
}

上面的函数,就是通过instance来实现单例的。

当第一次调用GetInstance时,instance 为NULL,所以会执行
instance = new Singleton();
把这个新建的实例保存到静态成员instance,并返回这个指针。

第二次到第N次调用GetInstance时,由于instance不为空,所以会直接返回instance 。也就是第一次调用GetInstance创建的那个实例。


所以这样就实现了,单实例。


意思就是说,Singleton对象的实例,只会被创建一次,就是说内存中,只存在一个Singleton的实例,就是所谓,单实例。

弄个生成单例的实例程序吧!

#include <sys/sem.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>
#include <iostream>  using namespace std;  #define MAXID	9999
static struct sembuf op_open={1,-1,0  };class GenHH{private:GenHH();//注意:构造方法私有 virtual ~GenHH();    static GenHH* instance;//惟一实例int opensem(key_t semkey);int creatsem(key_t semkey,int bigcount);int sem_open(int semid);unsigned int gen_seq();public:static GenHH* getInstance();//工厂方法(用来获得实例) unsigned int gen_hh();
}GenHH::~GenHH()
{if(instance != NULL)  {  delete instance;  }
}//初始化静态成员
GenHH* GenHH::instance=NULL;
GenHH* GenHH::getInstance()
{if(instance == NULL)  {  instance = new Singleton();  }  return instance; 
}unsigned int GenHH::gen_hh()
{unsigned int hh;char	chh[9];memset(chh,0,9);sprintf(chh,"%05d%04d",time(NULL)%100000,gen_seq());hh = atoi(chh);return hh;
}unsigned int GenHH::gen_seq()
{int	seq,kid;int	semid,semval;struct timeval  tv;union semun {int val;struct semid_ds *buf;unsigned short *array;} semctl_arg;kid=ftok("/etc/hosts",'m');if(kid<0){printf("system Error! Can't find  /etc/hosts!\n");gettimeofday(&tv, NULL);return tv.tv_usec % MAXID ;}semid=opensem(kid);if(semid<=0){semid=creatsem(kid,MAXID);if(semid<0){gettimeofday(&tv, NULL);return tv.tv_usec % MAXID ;}}semval=semctl(semid,1,GETVAL,0);if(semval<=2){semctl_arg.val=MAXID;if ((semctl(semid,1,SETVAL,semctl_arg)) < 0 ){gettimeofday(&tv, NULL);return tv.tv_usec % MAXID ;}}sem_open(semid);semval=semctl(semid,1,GETVAL,0);return MAXID-semval;
}int GenHH::opensem(key_t semkey)
{int semid;semid=semget(semkey,2,0);if(semid<0){printf("semaphoreid get error!\n");return -1;}return semid;
}int GenHH::creatsem(key_t semkey,int bigcount)
{int semid,semval;union semun {int val;struct semid_ds *buf;unsigned short *array;} semctl_arg;semid=semget(semkey,2,IPC_CREAT|0600);if(semid<0){return -1;}if((semval=semctl(semid,1,GETVAL,0))<0)printf("GETVAL error!\n");else if(semval==0){semctl_arg.val=1;if(semctl(semid,0,SETVAL,semctl_arg)<0)printf("SETVAL error\n");semctl_arg.val=bigcount;if(( semctl(semid,1,SETVAL,semctl_arg)) < 0 )printf("setval error\n");}return semid;
}int GenHH::sem_open(int semid)
{while(( semop(semid,&op_open,1) ) < 0 ){if( errno==EINTR ) {usleep(5000);continue;}printf("sem op_open error!\n");return -1;}return 0;
}int main(int argc, char* argv[])  
{GenHH *genHH1 = GenHH::getInstance();GenHH *genHH2 = GenHH::getInstance();cout<<genHH1->gen_hh()<<endl;cout<<genHH2->gen_hh()<<endl;return 0;
}

相关文章:

【Qt】通过QtCreator源码学习Qt(四):插件管理PluginManager

1、简介 QtCreator使用插件架构,方便扩展。它的核心是插件管理,主类是PluginManager。 下面是翻译src\libs\extensionsystem\pluginmanager.cpp中关于插件的一些说明,后续会详细分析插件管理的代码。 2、名字空间、主要类介绍 插件使用的名字空间是namespace:ExtensionS…

云从科技3D人体重建技术刷新3项纪录!仅凭照片即可生成精细模型

3 月 19 日&#xff0c;根据官方消息&#xff0c;云从科技基于单帧图像的 3D 人体重建技术同时在 Human3.6M、Surreal 和 UP-3D 三大数据集上创造了最新的世界纪录&#xff0c;将原有最低误差记录大幅降低 30%。Human3.6M 数据集上对比Surreal 数据集上对比UP-3D 数据集上对比3…

windows7/8 安装mysql5.7

简单记录下安装步骤&#xff1a; 网上下载了安装包&#xff0c;一路next默认即可&#xff0c;中间会出现 选择安装x64或 x86版本&#xff0c;这边科普下 x86代表32位操作系统&#xff0c;x64代表64位操作系统。 如果提示3306端口被占用&#xff0c;执行下netstat -aon|findst…

FGMap学习之--三维地图

你是否想让自己的地图以三维的形式展示出来呢&#xff1f;在三维下查看QQ地图、Bing地图、MapABC地图或者自己的地图是否有不一样的感觉呢&#xff1f;今天我们就来看看如果使用FGMap API来实现这个功能。 上次我们做了一个天气预报的示例&#xff0c;今天我们在三维地图上查看…

NLP实践:对话系统技术原理和应用

本文节选自电子工业出版社《自然语言处理实践&#xff1a;聊天机器人技术原理与应用》作者&#xff1a;王昊奋&邵浩&李方圆&张凯&宋亚楠以下是节选内容按照技术实现&#xff0c;我们可将任务驱动的对话系统划分为如下两类&#xff1a;模块化的对话系统分模块串…

沃尔沃加入英伟达阵营 2021年开卖自动驾驶汽车

随着研发的深入&#xff0c;自动驾驶行业越来越显现出合纵连横的趋势。本周&#xff0c;英伟达阵营再次迎来新的合作伙伴——沃尔沃和瑞典汽车零部件供应商Autoliv。其实此前沃尔沃的自动驾驶项目“DriveMe”所用的测试车辆就搭载了英伟达DrivePX平台&#xff0c;该公司的自动驾…

【Qt】通过QtCreator源码学习Qt(五):QLoggingCategory管理、分类、过滤打印信息

1、QLoggingCategory简介 在QtCreator源码中新学到一个类QLoggingCategory。 QLoggingCategory可以控制打印输出类别和区域。方便在调试时,过滤掉不关心的打印信息。 2、使用方法 声明 在头文件中声明,供其它文件使用 #include <QLoggingCategory> Q_DECLARE_LOGG…

个人随笔——衰人自叙卷壹

为什么80%的码农都做不了架构师&#xff1f;>>> 臣本菜鸟&#xff0c;求学于锦江&#xff0c;致力就职于专业&#xff0c;不求闻达于外企。HR不以臣级低&#xff0c;BOSS亲点&#xff0c;后召臣入研发部门&#xff0c;晓臣以编码之事&#xff0c;由是感激&#xff…

【Qt】通过QtCreator源码学习Qt(六):命令行参数解析实现

参考下大神的命令行参数解析是如何是实现的 //使用const char []代替宏定义字符串,我以前都是用const QString,想想好傻 const char SETTINGS_OPTION[] = "-settingspath"; const char INSTALL_SETTINGS_OPTION[] = "-installsettingspath"; const char…

【黑客浅析】像黑客一样思考

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 作者&#xff1a;由云鼎实验室发表在云社区 网络安全里经常说的一句话是未知攻焉知防&#xff0c;基本所有的安全人员也是一名黑客&#xff0c;在黑客攻击愈发普遍的今天&#xff0c;如何更好的防御黑客攻击…

Python的最佳学习方式

作者 | GENEVIEVE CARLTON译者 | 姜松浩责编 | 屠敏转载自 CSDN&#xff08;ID&#xff1a;CSDNNews&#xff09;以下为译文&#xff1a;如今想要学习 Python 的人拥有比以往更多的资源。但是&#xff0c;这也可能使筛选书籍、课程和其他 Python 资源变得相对困难。并不是每个人…

Android 系统启动过程

文章来源于网络&#xff0c;心得来源于整理。请尊重作者&#xff1a;http://hi.baidu.com/guoxiaoming/blog/item/24e9e9f8c9628f1fd9f9fd89.html/cmtid/7525d63fb437a6cd7c1e713bAndroid 系统启动过程Android 从系统启动有4个步骤: 1, init进程启动 2. Native服务启动 3.Syste…

【Qt】通过QtCreator源码学习Qt(七):插件管理类简介

一、名字空间:ExtensionSystem ExtensionSystem命名空间提供了属于核心插件系统的类。 ExtensionSystem包含插件管理器及其支持类,以及必须由插件提供者实现的IPlugin接口。 二、ExtensionSystem::PluginManager:插件主类 ExtensionSystem::PluginManager简介 三、Exten…

视频直播常见问题与解决办法汇总【系列二—直播截图】

2019独角兽企业重金招聘Python工程师标准>>> 摘要&#xff1a; 使用场景 用户常需要对视频直播的内容进行分析。例如&#xff0c;需要对直播中的某一帧的内容作为封面图片或者对于直播内容进行鉴黄以查看内容合法性等需求。因此&#xff0c;视频直播提供了实时截图功…

智能猫窝是如何诞生的?详解百度大脑的开放生态

3 月 20 日下午&#xff0c;首场百度大脑开放日在北京中关村创业大街百度大脑创新体验中心举行。百度 AI 技术生态部总经理喻友平&#xff0c;就百度大脑平台与生态进行了全面的详解&#xff0c;同时展示了百度大脑开放平台 Q1 核心升级内容&#xff0c;包括语音技术、视觉技术…

我都陪你坐了一天了,你好歹说句话啊!吖的,谱也忒大了。。。

我都陪你坐了一天了&#xff0c;你好歹说句话啊&#xff01;吖的&#xff0c;谱也忒大了。。。 查看图片 转载于:https://blog.51cto.com/guohongzhi521/552922

【linux】Linux下LCD自动熄屏解决方法

1、原因分析 参考博客&#xff1a; https://blog.csdn.net/BOJUE01/article/details/53468026?locationNum5&fps1 https://blog.csdn.net/mao0514/article/details/46562057 正常情况下Linux会在一段时间后默认关闭屏幕&#xff0c;默认为10分钟。开始一直认为是Gnome或K…

翻译机之后,搜狗再推智能硬件产品录音笔

去年 10 月&#xff0c;搜狗 AI 事业部总经理张博告诉 AI科技大本营&#xff08;ID:rgznai100&#xff09;&#xff0c;翻译机只是搜狗做智能硬件的开始&#xff0c;接下里半年里&#xff0c;他们还将发布数款集成了搜狗 AI 技术的硬件产品。 3 月 18 日&#xff0c;搜狗举办了…

小米正用时序数据库,解决这个“硬核”问题

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑作者 | 许俊红来源 | 小米云技术&#xff08;id&#xff1a;mi-cloud-tech&#xff09;时序数据根据维基百科的定义[1]&#xff0c;时间序列是一组按照时间发生先后顺序进行排列的数据点序列。时序数据库&#xff08;Tim…

【Qt】通过QtCreator源码学习Qt(八):插件生命周期及对应状态(代码走读)

1、简介 PluginManager管理插件IPlugin的生命周期,从初始化插件到删除插件共八个状态。插件状态表——PluginSpec::enum State { Invalid, Read, Resolved, Loaded, Initialized, Running, Stopped, Deleted}; 插件IPlugin的状态记录在与插件对应的插件说明PluginSpec中,状态…

第七课 环境变量PATH,cp、mv及查看文档cat/more/less/head/tail命令

一、环境变量&#xff08;PATH&#xff09;echo $PATH 查看环境变量的目录PATH$PATH:/tmp/ &#xff08;目录&#xff09;给一个目录赋值环境变量&#xff1b; 让以上环境变量永久生效&#xff1a; 编辑 vi /etc/profile/ 把以上参数加入到文本的最后&#xff0c;退出&#x…

asp.net获取页面url参数值的实现代码实例

asp.net获取页面url参数值的实现代码实例 file: default.aspx.cs using system; using system.data; using system.configuration; using system.collections; using system.web; using system.web.security; using system.web.ui; using system.web.ui.webcontrols; using sys…

【Qt】编译QtCreator

一、Ubuntu14.04编译QtCreator 4.0.3 1、准备工作 编译工具要求 Qt >= 5.5.0; g++ >= 4.7; 2、编译步骤 cd <QtCreator源码目录> qmake -r make 3、安装 make install INSTALL_ROOT=<指定目录> 二、Win10编译QtCreator 4.7.1 1、准备工作 编译工具…

Go Pro 半小时上手指南

Jack刚买了台Go Pro 6&#xff0c;商品包装内没有说明书&#xff0c;希望尽快拍那种慢动作或者酷炫的照片&#xff0c;去网上看了些贴都是注重结果&#xff0c;很少讲具体设置或技巧&#xff0c;光靠自己研究什么时候才能入门&#xff1f;《Go Pro 半小时上手指南》为你解决这些…

出身清华,大神朱俊彦再出GauGAN:AI让你变身神笔马良

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑作者 | Just出品 | AI科技大本营&#xff08;ID:rgznai 100&#xff09;一次 TED 演讲中&#xff0c;前锤子科技设计总监罗子雄分享如何入门学设计的经验。要想学好设计&#xff0c;他提醒观众要先看基础实例教程。由于互…

delphi中的第三方控件如何安装 (转)

最佳答案 由于组件提供的方式不同&#xff0c;所以安装的方法也是不一样的&#xff0c;下面就目前常见的各种形式的组 件的安装方法介绍一下。 1只有一个DCU文件的组件。DCU文件是编译好的单元文件&#xff0c;这样的组件是作者不想把源码公 布。一般来说&#xff0c;作…

【Qt】Qt中使用ssl时报错:qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method

一、问题 在Qt中使用https,运行时报错: qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method二、原因分析 SSLv2由于某些漏洞导致的不安全原因, 在某些linux发行版里的openssl库禁用掉了SSLv2 三、解决办法 重新编译openssl 1、下载openssl git clone …

渡鸦创始人离职百度后的下一个“真相”

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑作者 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;一直以来&#xff0c;渡鸦科技被外界看做是百度一次失败的收购。彼时彼刻&#xff0c;国内外智能音箱市场成为最火爆的兵家必争之地。渡鸦创始人、原…

QuickBI助你成为分析师——数据源FAQ小结

摘要&#xff1a; 添加数据源的时候经常会遇到各种问题&#xff0c;下面来讲解一下常见情况&#xff0c;若仍有疑问扫码咨询哦&#xff01;使用 Quick BI 分析数据时&#xff0c;需要先指定原始数据所在的数据源&#xff0c;测试连通数据源是数据分析的基础&#xff0c;下面让我…

HTML5 学习笔记(一)- video

直到现在&#xff0c;仍然没有一项可以让网页上显示视频的标准。大多数的视频都是通过插件&#xff08;如Flash&#xff09;来实现播放的&#xff0c;但是并不是所有的浏览器拥有同样的插件。 而伟大的HTML5规定了一个元素<video>来实现这种功能。 <video>支持Ogg、…