创建型:单例模式(singleton)

来源:互联网 发布:外汇软件 编辑:程序博客网 时间:2024/06/01 21:05

单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。唯一的实例是类的一个普通对象,但设计这个类时,让它只能创建一个实例并提供对此实例的全局访问。唯一实例类Singleton在静态成员函数中隐藏创建实例的操作。习惯上把这个成员函数叫做Instance(),它的返回值是唯一实例的指针。

如下实现中,CSingleton是一种线程安全,能够在类的析构行为中执行必须的操作比如关闭文件,释放外部资源(程序在结束的时候,系统会自动析构所有的全局变量。事实上,系统也会析构所有的类的静态成员变量,就像这些静态成员也是全局变量一样。利用这个特征,我们可以在单例类中定义一个这样的静态成员变量,而它的唯一工作就是在析构函数中删除单例类(CGarBage)的实例)。CSingleton2和CSingleton3是使用局部静态变量实现,非常强大的方法,完全实现了单例的特性,而且代码量更少,也不用担心单例销毁的问题。CSingleton3为了防止拷贝,将拷贝构造和赋值操作符声明为private

Singleton.h#ifndef SINGLE_INSTANCE_H#define SINGLE_INSTANCE_H class CSingleton{public:       staticCSingleton* instance();private:       CSingleton();       CSingleton(const CSingleton& copy);       CSingleton&operator = (const CSingleton&);       ~CSingleton();        /// garbagerecycle       class CGarBage{       public:              CGarBage(){}              ~CGarBage(){                     if(CSingleton::m_instance)                           deleteCSingleton::m_instance;              }       };private:       static CGarBagem_garbage;       static CSingleton* m_instance;}; /// implementation by local static variableclass CSingleton2{private:       CSingleton2()       {       }public:       static CSingleton2 * GetInstance()       {              static CSingleton2 instance;              return&instance;       }}; class CSingleton3{private:       CSingleton3()       {       }       /// avoid being copied and assigned       CSingleton3(constCSingleton &);       CSingleton3 &operator = (const CSingleton3 &);public:       static CSingleton3 & GetInstance()       {              static CSingleton3 instance;              return instance;       }};#endif

Singleton.cpp#include "SingletonInstance.h"#include <iostream>#include <mutex>namespace{       std::mutex uniqueMutex;}CSingleton* CSingleton::m_instance = 0;CSingleton::CGarBage CSingleton::m_garbage;CSingleton* CSingleton::instance(){       if (!m_instance){    /// 双重判断,防止大量线程阻塞              std::unique_lock<std::mutex>lock(uniqueMutex);              if(!m_instance){                     m_instance= new CSingleton();              }       }       return m_instance;}CSingleton::CSingleton(){       std::cout<< "constructor..." << std::endl;} CSingleton::~CSingleton(){       std::cout<< "destructor..." << std::endl;}


原创粉丝点击