搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > embed linux share > c语言设计模式--单例模式

c语言设计模式--单例模式

embed linux share 2020-03-26


科普文,给大家介绍单例模式的使用场合及其优缺点。

模式动机

单例模式是最简单的设计模式之一,顾名思义,整个系统中每个结构体只有一个实例存在,不能再多,否则就不叫单例。单例模式只应在有真正的“单一实例”的需求时才可使用。

场景:timo和gg都是同一个公司的职员,今天需要去找老板签署文件。

传统代码实现:

#include <stdio.h>//定义boss的行为
typedef struct BOSS
{
void (*vfunc)();
}s_boss;

void sign(char * str)
{
printf("老板给%s签署文件\n",str);
}
s_boss * boss;
void main()
{
//timo找老板签文件
boss = (s_boss *)malloc(sizeof(s_boss));
boss->vfunc = sign;
boss->vfunc("timo");
//释放内存
free(boss);

//gg找老板签文件
boss = (s_boss *)malloc(sizeof(s_boss));
boss->vfunc = sign;
boss->vfunc("gg");
//释放内存
free(boss);
}

代码可以直接复制粘贴在菜鸟 C 在线工具运行(https://c.runoob.com/compile/11)中查看运行结果。结果如下:

老板给timo签署文件
老板给gg签署文件

试想其他的员工也这样找老板签字,那频繁地创建及销毁BOSS这个结构体的话,势必会降低系统的运行效率。

解决方案

使用单例模式,封装boss的创建过程,系统中只需要维护的唯一BOSS结构体即可,减少系统的性能开销。

#include <stdio.h> //定义boss的行为 typedef struct BOSS   {      void (*vfunc)();   }s_boss; void sign(char * str) {  printf("老板给%s签署文件\n",str); } //统一访问boss的接口 void* get_boss()   {      static s_boss * boss = NULL;     //如果系统已经存在对象,直接返回对象指针   if(NULL != boss)         return boss;     //第一次访问时创建对象   boss = (s_boss *)malloc(sizeof(s_boss));   //初始化对象行为   boss->vfunc = sign;     return (void*)boss;   } void main() {  //timo找老板签文件  s_boss * boss;  boss = get_boss();  boss->vfunc("timo");  //gg找老板签文件  boss = get_boss();  boss->vfunc("gg"); }

代码可以直接复制粘贴在菜鸟 C 在线工具运行(https://c.runoob.com/compile/11)中查看运行结果。结果如下:

老板给timo签署文件
老板给gg签署文件

单例模式的主要优点在于提供了对唯一实例的受控访问并可以节约系统资源;其主要缺点在于因为缺少抽象层而难以扩展

单例模式适用情况包括:

1、系统只需要一个实例对象;

2、客户调用对象的单个实例只允许使用一个公共访问点。


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《c语言设计模式--单例模式》的版权归原作者「embed linux share」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注embed linux share微信公众号

embed linux share微信公众号:gh_17398adec105

embed linux share

手机扫描上方二维码即可关注embed linux share微信公众号

embed linux share最新文章

精品公众号随机推荐