目录
一、前言
单例模式(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