设计模式学习(五):单例模式及其优化示例(C语言)

本文详细介绍了单例模式的概念、作用,并通过C语言展示了懒汉式(非线程安全、线程安全)、懒汉式+OpenMP并行编程以及饿汉式的实现方式,探讨了各种实现的优缺点和适用场景。最后,总结了单例模式的优缺点以及可能的优化改进方案。
摘要由CSDN通过智能技术生成

一、前言

单例模式(Singleton Pattern)是最简单的设计模式之一,因此并不为其专门开一次研讨会,在闲余时间自行学习,接下来我们来看看该模式的具体内容。

二、单例模式

单例模式即保证一个类仅有一个实例,并提供一个访问它的全局访问点

单例模式本质上就是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可
以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。

由此可见,单例模式主要是用来避免 一个全局使用的类被频繁地创建与销毁 的情况,当我们想控制实例数目或者节省系统资源的时候使用。

三、示例类图

在这里插入图片描述
单例模式类的构造函数需设置为私有,避免用户在外部调用,并提供一个公有的获取唯一实例的接口。

四、示例代码

4.1 懒汉式(非线程安全)

懒汉式的特点是延迟加载,比如配置文件,采用懒汉式的方法,顾名思义,懒汉么,很懒的,例如配置文件的实例在用到的时候才会加载。
简单理解即在第一次获取类的实例时调用构造函数进行实例化。

首先来看看最基本的实现,这种实现最大的问题就是不支持多线程。当多个线程同时请求第一次获取实例时可能会创建多个指向不同实例的指针。

这种实现通常用在不要求线程安全的情况,优点是节省内存(第一次获取时才创建实例),并且运行效率高,但在多线程不能正常工作。代码如下:

//singleton.h
#ifndef SINGLETON_H
#define SINGLETON_H

#include <stdio.h>
#include <stdlib.h>

typedef struct  _singleton_t {
   
	int data;
}singleton_t;

/**
* @method singleton
* 获取唯一实例(getInstance接口)。
*
* @return {singleton_t*} 返回singleton实例。
*/
singleton_t* singleton();

/**
* @method singleton_destroy
* 析构函数(销毁singleton实例,释放内存)。
*/
void singleton_destroy();

#endif /*SINGLETON_H*/
//singleton.c
#include "singleton.h"
#include <assert.h>

/* 全局静态指针(指向唯一实例) */
static singleton_t* s_singleton = NULL;

static singleton_t* singleton_create() {
   
	s_singleton = (singleton_t*)malloc(sizeof(singleton_t));
	s_singleton->data = 0;
	return s_singleton;
}

singleton_t* singleton() {
   
	if (s_singleton == NULL) {
   
		singleton_create();  /* 调用构造函数实例化 */
	}
	assert(s_singleton != NULL);
	return s_singleton;
}

void singleton_destroy() {
   
	if (s_singleton != NULL) {
   
		free(s_singleton);
	}
}
//main.c
#include "singleton.h"

int main(int argc, const char* argv[]) {
   

	singleton_t* singleton1 = singleton();
	singleton1
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值