设计模式(4)-单例模式

来源:互联网 发布:linux telnet连接失败 编辑:程序博客网 时间:2024/04/30 00:11

单例模式

   单例模式属于创建型的设计模式,其特点是在于保证一个类只会被实例化一次,可以作为全局唯一资源提供给系统。

代码

  此处通过判断两个实例的地址是否一致来验证单例模式,代码中包含了保证多线程安全的单例模式实现。由于Python下的懒汉单例模式实现本人觉得是不可能的,因此下面使用了double check的方式实现了单例模式的饿汉实现

C++代码

  文件构成:
  —include
  ——Singleton.h
  —src
  ——Singleton.cpp
  ——main.cpp
  代码如下:
  —include/Singleton.h

#ifndef _SINGLETON_H_#define _SINGLETON_H_#include<pthread.h>class Singleton{public:    static Singleton* GetInstance();private:    Singleton();    static Singleton* instance;    static pthread_mutex_t mutex;    //用于释放instance的空间    class Gabor    {    public:        ~Gabor();    };    static Gabor gabor;};#endif

  —src/Singleton.cpp

#include<iostream>#include"Singleton.h"using namespace std;Singleton* Singleton::instance = NULL;pthread_mutex_t Singleton::mutex;Singleton::Gabor Singleton::gabor;Singleton::Singleton(){    ;}Singleton* Singleton::GetInstance(){    if(instance == NULL)    {        pthread_mutex_lock(&mutex);        //double check        if(instance == NULL)        {            instance = new Singleton();        }        pthread_mutex_unlock(&mutex);    }    return instance;}Singleton::Gabor::~Gabor(){    delete Singleton::instance;}

  —src/main.cpp

#include"Singleton.h"#include<iostream>using namespace std;int main(){    Singleton *instance1=Singleton::GetInstance();    Singleton *instance2=Singleton::GetInstance();    if(instance1 == instance2)    {        cout<<"This is a successful Singleton."<<endl;    }    else    {        cout<<"This is not a successful Singleton."<<endl;    }    return 0;}

Python代码

  文件构成:
  —Singleton.py
  代码如下:
  —Singleton.py(说明:Python中由于没有办法像 C++那样将构造函数设置为private属性从而实现不允许实例化,因此我们只能从Python的类构造函数入手,Python的类构造函数是new(cls, *args, **kwargs)函数,而不是init

import threadingclass Singleton(object):    __instance = None    __lock = threading.Lock()    def __init__(self):        pass    def __new__(cls, *args, **kwargs):        if not cls.__instance:            cls.__lock.acquire()            if not cls.__instance:                cls.__instance = super(Singleton, cls).__new__(cls, *args, **kwargs)            cls.__lock.release()        return cls.__instanceif "__main__" == __name__:    instance1 = Singleton()    instance2 = Singleton()    if id(instance1) == id(instance2):        print "This is a successful Singleton."    else:        print "This is not a successful Singleton."
0 0
原创粉丝点击