定义
确保一个类只有一个实例,并提供一个全局访问点
要点
- 单件模式确保程序中一个类最多只有一个实例
- 单件模式提供访问这个实例的全局点
类图
代码实现及实例
我们在编写某个产品设备的代码时,总是会涉及到设备的一些配置及运行参数。比如串口的波特率、带网络的还有IP地址,设备的编号名称等等。这些参数在整个系统中是唯一的,对这些参数的操作我们可以采用单件模式来实现
<Singleton>
typedef struct _singletonParam { unsigned int magic_num; unsigned int dev_id; . . . . . }SingletonParam;
下面的代码获取到一个实例,为了保持和OO设计里面单件模式代码一致性,用动态分配内存的方式"实例化"一个SingletonParam
SingletonParam *get_singletonparam() { static SingletonParam *gParam=0; if(gParam==0) { gParam=(SingletonParam *)malloc(sizeof(SingletonParam )); //判断下gParam是否为0 } return gParam; }
剩下就是读写参数之类的函数了(全局访问点)
void set_param(unsigned int pval) { SingletonParam *param=get_singletonparam(); if(param==0) return; //设置某个参数项的值 }
实际应用中,可以不用动态分配内存的方式
白话
单件模式在C中,说穿了在C中就是一个全局变量(个人理解)。但是在实际的应用中,你在实现某个功能函数或模块时,发现非要用全局变量才能实现,那就搞一个出来,并且对这个全局变量的读写等操作都要封装起来,不要怕麻烦。如果一个函数中大量的使用全局变量,不方便进行代码测试,要是还随便在函数里面直接对全局变量进行赋值操作,产品一出问题,等你来调试程序查找到出问题的函数或模块代码时,一看代码,头都是大的,全局变量太多了,你都不知道全局变量的值是在什么时候被谁修改了,哭死你,慢慢找吧。记住,写出来容易,维护难。代码不光是给机器用的,还有别的程序猿要看,要复用(吐槽下,搜狗的拼音打"程序员",直接出来"程序猿",无语。。。)