单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在C语言中实现单例模式,可以避免资源浪费,并保证全局访问的一致性。本文将详细介绍C语言中单例模式的经典实现方法,并分享一些实战技巧。
单例模式的基本原理
单例模式的核心思想是确保一个类只有一个实例,并提供一个全局访问点。在C语言中,通常通过以下步骤实现:
- 私有化构造函数,防止外部直接创建实例。
- 提供一个静态方法,用于获取类的唯一实例。
- 使用静态变量存储类的唯一实例。
经典实现方法
以下是一个C语言中单例模式的经典实现示例:
#include <stdio.h>
// 定义单例类
typedef struct {
int value;
} Singleton;
// 静态变量存储类的唯一实例
static Singleton* instance = NULL;
// 私有化构造函数
static Singleton* createInstance() {
if (instance == NULL) {
instance = (Singleton*)malloc(sizeof(Singleton));
if (instance != NULL) {
instance->value = 0;
}
}
return instance;
}
// 公共接口,用于获取类的唯一实例
Singleton* getInstance() {
if (instance == NULL) {
instance = createInstance();
}
return instance;
}
// 模拟业务方法
void setValue(Singleton* singleton, int value) {
if (singleton != NULL) {
singleton->value = value;
}
}
// 模拟业务方法
int getValue(Singleton* singleton) {
if (singleton != NULL) {
return singleton->value;
}
return -1;
}
int main() {
Singleton* singleton1 = getInstance();
setValue(singleton1, 10);
printf("Singleton1 value: %d\n", getValue(singleton1));
Singleton* singleton2 = getInstance();
printf("Singleton2 value: %d\n", getValue(singleton2));
return 0;
}
实战技巧
懒汉式单例:以上示例中,单例实例在第一次调用
getInstance()方法时创建。这种方式称为懒汉式单例,适用于单例实例创建开销较大,且不需要立即创建的场景。饿汉式单例:在程序启动时创建单例实例,这种方式称为饿汉式单例。以下是一个饿汉式单例的示例:
#include <stdio.h>
typedef struct {
int value;
} Singleton;
// 静态变量存储类的唯一实例
static Singleton instance = {0};
// 公共接口,用于获取类的唯一实例
Singleton* getInstance() {
return &instance;
}
// 模拟业务方法
void setValue(Singleton* singleton, int value) {
if (singleton != NULL) {
singleton->value = value;
}
}
// 模拟业务方法
int getValue(Singleton* singleton) {
if (singleton != NULL) {
return singleton->value;
}
return -1;
}
int main() {
Singleton* singleton = getInstance();
setValue(singleton, 10);
printf("Singleton value: %d\n", getValue(singleton));
return 0;
}
- 线程安全:在多线程环境下,单例实例的创建和访问需要保证线程安全。可以使用互斥锁(mutex)来保护单例实例的创建过程。以下是一个线程安全的懒汉式单例示例:
#include <stdio.h>
#include <pthread.h>
typedef struct {
int value;
} Singleton;
// 静态变量存储类的唯一实例
static Singleton* instance = NULL;
// 互斥锁
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 线程安全的创建实例函数
static Singleton* createInstance() {
if (instance == NULL) {
pthread_mutex_lock(&mutex);
if (instance == NULL) {
instance = (Singleton*)malloc(sizeof(Singleton));
if (instance != NULL) {
instance->value = 0;
}
}
pthread_mutex_unlock(&mutex);
}
return instance;
}
// 线程安全的公共接口
Singleton* getInstance() {
if (instance == NULL) {
instance = createInstance();
}
return instance;
}
// 模拟业务方法
void setValue(Singleton* singleton, int value) {
if (singleton != NULL) {
singleton->value = value;
}
}
// 模拟业务方法
int getValue(Singleton* singleton) {
if (singleton != NULL) {
return singleton->value;
}
return -1;
}
int main() {
Singleton* singleton = getInstance();
setValue(singleton, 10);
printf("Singleton value: %d\n", getValue(singleton));
return 0;
}
通过以上经典实现和实战技巧,相信您已经对C语言中单例模式有了更深入的了解。在实际开发中,根据具体需求选择合适的单例模式实现方式,可以提高代码的可读性和可维护性。
