概念
单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
介绍
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
核心
在类构造函数中声明静态指针变量并初始化为NULL,当创建后,该变量指向创建地址,根据该变量判断该类是否创建过,若无,则创建,否则,返回该变量即可
。
示例
★包含头文件single.h和源文件single.c(均已验证通过)。
single.h
* @Filename : single.h * @Revision : $Revision: 1.0 $ * @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅) * @Description : 单例模式应用(C语言模拟C++) * @Explain : 单例模式,只允许创建一个对象 **/ #ifndef __SINGLE_H__ #define __SINGLE_H__ #include <stdio.h> #include <string.h> #include <stdlib.h> /* 类操作, 带参数 */ #define CLASS_CALL(THIS,func,args...) ((THIS)->func(THIS,args)) /* 类操作, 无参数 */ #define CLASS_CALL_0(THIS,func) ((THIS)->func(THIS)) /* 单例类定义 */ struct single { char name[16]; /* 类名 */ void (*show)(struct single *p_single); }; /* 创建Single对象 */ struct single *new_single(char *name); #endif
single.c
/** * @Filename : single.c * @Revision : $Revision: 1.0 $ * @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅) * @Description : 单例模式应用(C语言模拟C++) * @Explain : 单例模式,只允许创建一个对象 **/ #include "single.h" /** * @输出类名 * @p_single:single类 **/ static void _show(struct single *p_single) { printf("the class name is :%s\n", p_single->name); } /** * @创建single对象 * @name:类名 * @成功返回类对象,失败返回NULL **/ struct single *new_single(char *name) { static struct single *p_single = NULL; if (p_single != NULL) { printf("The singleton object already exists...\n"); return p_single; } if ((p_single = (struct single *)malloc(sizeof(struct single))) == NULL) return NULL; memset((char *)p_single, 0, sizeof(struct single)); strcpy(p_single->name, name); p_single->show = _show; printf("The singleton object was created successfully...\n"); return p_single; } /** * @主函数,演示代码 **/ int main(void) { struct single *p_single = new_single("feng"); struct single *p_single1 = new_single("seven"); /* seven在feng创建之后,所以seven创建失败,将会得到的是feng对象 */ CLASS_CALL_0(p_single, show); CLASS_CALL_0(p_single1, show); return 0; }
结论
feng:single$ gcc -o single single.c feng:single$ ./single The singleton object was created successfully... The singleton object already exists... the class name is :feng the class name is :feng feng:single$
示例代码通过new_single()创建两个单例对象p_single和p_single1,然后输出单例对象名字,实际上情况是,只有p_single对象创建并实例化成功,p_single1创建后同样指向p_single,体现了单例模式的基本特性,即:
一个类有且仅有一个实例
。
往期 · 推荐
也没想象中那么神秘的数据结构-先来后到的“队列”(链式队列)
关注
更多精彩内容,请关注微信公众号:不只会拍照的程序猿,本人致力分享linux、设计模式、C语言、嵌入式、编程相关知识,也会抽空分享些摄影相关内容,同样也分享大量摄影、编程相关视频和源码,另外
你若想要本文章源码请关注公众号:不只会拍照的程序猿,后台回复:设计模式源码,也可
点击此处下载
。