本文介绍: 需要注意的是,使用单例模式时应该慎重考虑,合理评估是否真正需要全局唯一实例。滥用单例模式可能会导致代码复杂性增加,并且可能隐藏了类之间的依赖关系。单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供全局访问点以获取该实例。
代码实现:
c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
// 定义单例对象结构体
typedef struct {
// 单例对象的数据成员
int value;
} Singleton;
// 静态变量,用于保存唯一实例的指针
static Singleton* instance = NULL;
// 互斥锁,用于保护临界区
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 获取单例对象的函数
Singleton* getSingleton() {
// 首先检查实例是否已经存在
if (instance == NULL) {
// 对临界区加锁
pthread_mutex_lock(&mutex);
// 再次检查实例是否已经被创建
if (instance == NULL) {
// 创建单例对象
instance = (Singleton*) malloc(sizeof(Singleton));
instance->value = 0;
}
// 解锁临界区
pthread_mutex_unlock(&mutex);
}
return instance;
}
// 示例线程函数,对单例对象进行操作
void* threadFunc(void* arg) {
Singleton* singleton = getSingleton();
// 模拟对单例对象的操作
singleton->value += 1;
printf("Singleton value: %dn", singleton->value);
return NULL;
}
int main() {
// 创建多个线程来同时访问单例对象
pthread_t thread1, thread2, thread3;
pthread_create(&thread1, NULL, threadFunc, NULL);
pthread_create(&thread2, NULL, threadFunc, NULL);
pthread_create(&thread3, NULL, threadFunc, NULL);
// 等待线程结束
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
pthread_join(thread3, NULL);
return 0;
}
单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供全局访问点以获取该实例。
优点:
- 严格控制实例个数:单例模式可以防止多个实例的创建,确保在整个应用程序中只有一个实例存在。
- 全局访问性:由于单例实例通常是全局可访问的,因此可以方便地在应用程序的不同部分使用和调用。
- 节约资源:由于单例模式只创建一个实例,可以节约系统资源,例如内存和处理器时间。
- 简化配置:单例模式可以将一些需要共享的配置信息集中管理,减少了重复的配置操作。
缺点:
- 违反单一职责原则:由于单例模式通常负责创建自己的实例和管理全局状态,可能会导致单例类职责过重,违反了单一职责原则。
- 难以扩展和测试:由于单例模式的全局访问性和紧耦合性,对于扩展和测试来说可能会更加困难。因为修改单例类可能会影响到其他依赖它的代码。
适用场景:
- 资源共享:当多个对象需要共享同一资源时,可以使用单例模式来确保只有一个实例提供该资源。
- 全局访问:对于需要在系统的多个部分中使用相同实例的情况,单例模式提供了一种方便的方式来访问实例。
- 控制对象数量:有些情况下,由于资源限制或性能要求,需要限制某个类只能拥有一个实例。
需要注意的是,使用单例模式时应该慎重考虑,合理评估是否真正需要全局唯一实例。滥用单例模式可能会导致代码复杂性增加,并且可能隐藏了类之间的依赖关系
原文地址:https://blog.csdn.net/qq_32059343/article/details/134629071
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_19822.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。