单例模式简析:C语言实现单例模式

目录

[0 相关内容](#0 相关内容)

[1 单例模式](#1 单例模式)

[1.1 核心思想](#1.1 核心思想)

[1.2 现实生活中的例子](#1.2 现实生活中的例子)

[1.3 嵌入式中的例子](#1.3 嵌入式中的例子)

[1.4 单例模式简单实操](#1.4 单例模式简单实操)


0 相关内容

面向对象C语言基础:设计模式之单例模式_哔哩哔哩_bilibili

单例模式 (Singleton Pattern)详解

1 单例模式

它确保某个类只有一个实例存在,并提供一个全局访问点来获取这个实例。

1.1 核心思想

单例模式的核心思想是:控制类的实例化过程,确保在整个应用程序中只存在一个实例。

  • 唯一性:整个应用程序中只能有一个实例

  • 全局访问:提供全局访问点获取这个唯一实例

  • 延迟初始化:通常在第一次使用时才创建实例

  • 线程安全:在多线程环境下保证只创建一个实例

1.2 现实生活中的例子

想象一下以下场景:

  • 公司CEO:一个公司只能有一个CEO

  • 国家总统:一个国家在同一时期只能有一个总统

  • 打印机:办公室里通常只有一台打印机供大家使用

其他常见例子:

  • 系统配置管理器:整个系统只需要一个配置管理器

  • 日志记录器:应用程序通常只需要一个日志系统

  • 缓存管理器:全局缓存管理器应该是唯一的

  • 任务管理器:系统任务调度器应该是单例的

1.3 嵌入式中的例子

假设此时产品上连接有一个打印机,此时,打印机作为唯一的一个硬件,假设此时有3个程序员(应用程序)都需要使用这个打印机。如果不使用单例模式,那么有可能发生以下情况:

  • 程序员A使用打印机前初始化打印机,然后打印数据。

  • 程序员B使用打印机之前不知道A初始化了打印机,又初始化了打印机,然后打印数据。

  • 程序员C同理,使用打印机之间还初始化了打印机,然后打印数据。

首先,我们都知道,一般来说,硬件的初始化是非常耗时的,这里初始化了3遍打印机。大量时间被无意义地耗费了。

而且,更重要的是,在程序员B初始化打印机的时候,A 在初始化打印机的设置就被完全清空了!假设 A 和 B 各自实例化了一个打印机对象,程序员A打印了 5 页纸,在 A 的记录中,打印机的 print_cnt 应该等于 5 ,但是 B 又初始化了一遍打印机,B 的记录中打印机的 print_cnt 应该是 0 ,而且,打印机里的设置也有可能和 A 里面的打印机对象对不上了。这下,一切都乱套了。

所以我们要使用单例模式,单例模式,顾名思义,只有单个实例。让 A 去创建打印机对象、得到对象的地址、打印 5 页纸之后,B 再去调用、打印的时候,拿到的是同一个对象的地址,C 也同理。硬件不会被重复初始化,所有人操作的都是同一个对象(即单例模式提供的一个全局访问点),这样才会更加安全高效。

1.4 单例模式简单实操

来一个简单的实操例子:

我们可以定义一个 get_printer_instance() 函数,使用 static 关键字来保证只有一个实例对象被创建,同时,使用一个static初始化状态标志(一般来说,这个初始化状态是不能被外界看到的,需要保护),使用标志来确认这个实例是否被初始化。

cpp 复制代码
// printer class
typedef struct printer
{
    int printer_port;
    int print_cnt;
}printer_t;

printer_t* get_printer_instance(void)
{
    static printer_t instance;
    static int init_state = 0;  // 0: not init  1: inited
    if (!init_state)
    {
        // init object
        instance.print_cnt = 0;
        instance.printer_port = 0x378;
        init_state = 1;
    }
    // return the pointer to instance
    return &instance;
}

此时,无论外部谁来调用 get_printer_instance() ,得到的都是指向同一个对象的指针,后续操作的也就都是同一个对象。

相关推荐
程序员老舅13 小时前
【无标题】
c++·嵌入式·八股文·c++八股文·八股文面试题·c++面经·c++面试题
小龙报13 小时前
【C语言进阶数据结构与算法】LeetCode27 && LeetCode88顺序表练习:1.移除元素 2.合并两个有序数组
c语言·开发语言·数据结构·c++·算法·链表·visual studio
无限进步_13 小时前
C语言实现贪吃蛇游戏完整教程【最终版】
c语言·开发语言·c++·git·游戏·github·visual studio
项目題供诗14 小时前
C语言基础(十)
c语言·开发语言
代码游侠14 小时前
学习笔记——GPIO按键与中断系统
c语言·开发语言·arm开发·笔记·嵌入式硬件·学习·重构
保护我方头发丶14 小时前
hard_link.bat(个人用)
c语言
你爱写程序吗(新H)14 小时前
基于单片机的洗衣机控制系统设计 单片机洗衣机控制(设计+文档)
c语言·汇编·单片机·嵌入式硬件·matlab
charlie11451419114 小时前
现代嵌入式C++教程:对象池(Object Pool)模式
开发语言·c++·学习·算法·嵌入式·现代c++·工程实践
HABuo14 小时前
【linux进程控制(三)】进程程序替换&自己实现一个bash解释器
linux·服务器·c语言·c++·ubuntu·centos·bash
恶魔泡泡糖14 小时前
51单片机I-O扩展1
c语言·嵌入式硬件·51单片机