单例模式是保证类仅有一个实例,允许其全局访问。根据特性分为预加载(饿汉模式)与懒加载(懒汉模式,其区别在于预加载在初始化的时候就加载,懒加载在使用的时候才加载,由此懒加载也带来一个问题就是线程安全。我们此处只实现预加载。
C语言版本
在C语言里面实现的原理就是 利用静态变量,同时我们应该考虑到使用单例模式往往不只是一个变量,是对一个或多个变量操作的封装,整体是单例。基于此我们设计代码如下:
#include <stdio.h>
struct Singleton
{
int data;
void (*test)(struct Singleton *args);
};
void test_fun(struct Singleton *args)
{
printf("test %d\n",args->data);
}
static struct Singleton gSignleton = {0,test_fun};//预加载,初始化即加载
struct Singleton* get_instance(void ){
return &gSignleton;
}
int main() {
struct Singleton *instance = get_instance();
instance->data = 22;
instance->test(instance);
struct Singleton *instance2 = get_instance();
instance2->test(instance2);
return 0;
}
-----------------
运行结果:
test 22
test 22
C++版本:
#ifndef UNTITLED_SINGLETON_H
#define UNTITLED_SINGLETON_H
class Singleton{
public:
static Singleton *GetInstance();
int data;
protected:
private:
static Singleton instance;
Singleton();
~Singleton();
// 将其拷贝构造和赋值构造成为私有函数, 禁止外部拷贝和赋值
Singleton(const Singleton&);
Singleton &operator=(const Singleton&);
};
#endif //UNTITLED_SINGLETON_H
#include "Singleton.h"
Singleton Singleton::instance;
Singleton::Singleton() {
}
Singleton::~Singleton() {
}
Singleton *Singleton::GetInstance()
{
return &instance;
}