四时宝库

程序员的知识宝库

设计模式之单例模式(C语言版本)(单例模式c++11)

单例模式是保证类仅有一个实例,允许其全局访问。根据特性分为预加载(饿汉模式)与懒加载(懒汉模式,其区别在于预加载在初始化的时候就加载,懒加载在使用的时候才加载,由此懒加载也带来一个问题就是线程安全。我们此处只实现预加载。

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;
}

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接