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

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

例1:传统代码实现:

附例1代码:

//小问学编程
#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);
}

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

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

例2:单例实现:


附例2代码:

//小问学编程
#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;
}
int main()
{//timo找老板签文件s_boss * boss;boss = get_boss();boss->vfunc("timo");//gg找老板签文件boss = get_boss();boss->vfunc("gg");
}

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

单例模式适用情况包括:

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

C语言之设计模式——单例模式相关推荐

  1. Go 语言实现 23 种设计模式 单例模式

    Go 语言实现 23 种设计模式 单例模式 单例模式 单例模式是一种常用的软件设计模式,在使用过程中,单例对象的类只有一个实例.使用单例模式,1 可以节省内存等资源,例如windows操作系统的资源管 ...

  2. 软件设计模式“单例模式”和“工厂模式”

    软件设计模式"单例模式"和"工厂模式" 单例模式 什么是单例模式 单例模式的实现方式有哪些 单例模式的优缺点 单例模式的应用场景 总结 工厂模式 什么是工厂模式 ...

  3. 【设计模式】的C语言的设计模式及其应用

    转自https://blog.csdn.net/devcloud/article/details/95615621 [摘要] 软件编写模式是开发过程中的重要经验总结.灵活运用设计模式,一方面利于我们编 ...

  4. JavaScript设计模式----单例模式

    声明:这个系列为阅读<JavaScript设计模式与开发实践> --曾探@著一书的读书笔记 1.单例模式的特点和定义 保证一个类仅有一个实例,并且提供一个访问它的全局访问点. 2.传统面向 ...

  5. Python设计模式-单例模式

    Python设计模式-单例模式 基于Python3.5.2,代码如下 #coding:utf-8 import threading import timeclass Singleton(object) ...

  6. Android设计模式——单例模式(Singleton)

    二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元 ...

  7. 【学习笔记】ABAP OOD设计模式 - 单例模式

    ABAP OOD设计模式 - 单例模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 单例模式(Singleton Pattern)是常用的且较为简单的软件设计模式 ...

  8. Go语言中的单例模式

    转载地址:https://mp.weixin.qq.com/s/JAlt0JQt8hkPCxYbmOMFJw Go语言中的单例模式 在过去的几年中,Go语言的发展是惊人的,并且吸引了很多由其他语言(P ...

  9. elm具体实现过程_函数式编程中的战斗机(二)---elm语言MUV设计模式应用实例...

    1 elm语言设计模式的特点 1.1 面向对象设计模式的特点 每种编程语言都有其独特的语法和优缺点,从而导致与众不同的设计模式和固定架构.面向对象编程因其竭力接近和模拟现实世界的多态和继承,导致面向对 ...

最新文章

  1. Python设置环境变量,改变GnomeConnectionManager的语言
  2. 撰写论文时word使用诀窍标题
  3. 轻松了解“Web应用防火墙”
  4. Android Studio开发版(debug)和发布版(release)获取SHA1和MD5和SHA256的最原始方法
  5. matlab+信号+mpf,Python和Matlab中平均频率的差异
  6. Elasticsearch Scale Out
  7. oracle有哪两种内存结构,Oracle体系结构详解(物理构造,内存结构和逻辑结构)...
  8. vue 属性 watch
  9. mysql怎么同时输入多个值_mysql – 一个字段搜索多个值
  10. PHP 中的对象传递
  11. python 插入查找
  12. javamail 收件人/发件人 乱码解析
  13. ubuntu txt文件打开乱码怎么恢复正常
  14. 北京找工作之艰难困苦
  15. 【工作笔记】004 tapestry框架
  16. php 微信模拟登陆给用户发送消息(文字,图片,图文)
  17. 苹果手机用户流失严重,竟是因为这个原因?
  18. IP、子网、超网(CIDR)、网段知识讲解
  19. android chrome无法运行,Android 测试 Chrome 浏览器能正常启动 Chrome 浏览器,但是不能进行操作,求大神!!...
  20. node.js map 的用法

热门文章

  1. Cron 触发器及相关内容 (第四部分)
  2. Cron 触发器及相关内容 (第三部分)
  3. indesign如何画弧线_【美妆】鼻影怎么画,才能拥有比例完美的鼻子?
  4. 基于JAVA+SpringMVC+Mybatis+MYSQL的OA办公管理系统
  5. java applet 换行_如何用java applet 画字符串,宽度大于设定值,自动换行
  6. MySQL可以用localhost 连接,但不能用IP连接的问题
  7. Cacti监控mysql数据库server实现过程
  8. window下搭建linux虚拟机
  9. 作品2:资源管理器EX(原味浏览图片)
  10. 登录时 按Enter 进入登录界面 或者下一行