设计模式--单例模式(C语言案例)

模式动机

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

场景: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、客户调用对象的单个实例只允许使用一个公共访问点。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值