设计模式C++描述----01.单例(Singleton)模式

原创 2012年03月30日 17:48:20

一.概念

单例模式:其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。

class CSingleton
{
//公有的静态方法,来获取该实例
public:
static CSingleton* GetInstance()
{
    if ( m_pInstance == NULL )  //判断是否第一次调用
        m_pInstance = new CSingleton();

    return m_pInstance;
}

//私有构造函数,防止实例化
private:
    CSingleton(){};


//私有静态指针变量,指向类的唯一实例
private:
    static CSingleton * m_pInstance; //声明一个静态成员
};

CSingleton* CSingleton::m_pInstance = NULL; //定义并初始化静态数据成员

int main()
{
    CSingleton* ps1 = CSingleton::GetInstance();
    CSingleton* ps2 = CSingleton::GetInstance();
    CSingleton* ps3 = ps1->GetInstance();
    CSingleton & ps4 = * CSingleton :: GetInstance(); 

    if (ps1 == ps2)
    {
        cout<< "ps1 = ps2"<<endl;
    }

    if (ps1 == ps3)
    {
        cout<< "ps1 = ps3"<<endl;
    }

    if (&ps4 == ps1)
    {
        cout<< "ps1 = ps4"<<endl;
    }

    return 0;
}

单例模式通过类本身来管理其唯一实例,唯一的实例是类的一个普通对象但设计这个类时,让它只能创建一个实例并提供对此实例的全局访问

用户访问唯一实例的方法只有 GetInstance() 成员函数。如果不通过这个函数,任何创建实例的尝试都将失败,因为类的构造函数是私有的。

有一点要注意:一定要加上 CSingleton* CSingleton::m_pInstance = NULL; 这一句,不然的话编译会出错,因为这一句才是变量定义。

二.单例类CSingleton 有以下特征

它有一个指向唯一实例的静态指针m_pInstance并且是私有的

它有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例;

它的构造函数是私有的,这样就不能从别处创建该类的实例。

三.存在的问题

1.m_pInstance 指向的空间什么时候释放呢?

如果在类的析构行为中有必须的操作,比如关闭文件,释放外部资源,那么上面的代码无法实现这个要求。我们需要一种方法,正常的删除该实例。

不合理的解决方法:

在程序结束时调用 GetInstance(),并对返回的指针掉用 delete操作。这样做可以实现功能,但不仅很丑陋,而且容易出错。因为这样的附加代码很容易被忘记,而且也很难保证在delete之后,没有代码再调用 GetInstance 函数。也就是说释放操作由使用者来管理,而不是由类本身来管理,这违背了类的单一职责的原则,这是不合理的。

2. 该实例的析构函数什么时候执行?

上面的类里为什么没有析构函数,其实即便你加上析构函数也是可以的,但是这个析构函数不会被执行的。因为你的实例是 new 出来的,所以只有 delete 时,才会调用析构函数,但是在哪里调用 delete 呢!?这又回到了上面的问题。

一种妥善的方法:

class CSingleton
{
public:
    static CSingleton* GetInstance()
    {
        static CSingleton instance; //静态局部变量
        
        return &instance;
    }

private:

    CSingleton() {}; //构造函数

};
局部静态对象实例 instance 是第一次调用 GetInstance() 时被构造,一直保持活动状态直到应用程序终止,与动态分配对象不同,静态对象当应用程序终止时被自动销毁掉,所以就不必再手动销毁实例了。

当然这里,可以加上析构函数来处理你想要的操作。

这样做的要点有以下几点:

1. 静态变量在内存中只有一份,从而保证了单例模式中单一实例的要求。

2. 静态变量在程序终止时会被自动销毁,从而保证了空间正常释放。

C++设计模式5--单例模式Singleton--当前对象只有一个实例

很多情况下,我们在开发项目的过程中,都希望自己运行的某个部件只有一个实例, 比如我们天天用QT开发界面,QTCreate里帮助菜单下的关于Qt Create菜单,弹出来的关于对话框,在QTCreate...
  • gatieme
  • gatieme
  • 2014年01月08日 13:25
  • 21427

设计模式:单例模式(Singleton)

单例模式在23个设计模式中算得上是最简单的一个了,也行你会有异议,那就换成“最简单之一”,这样就严谨了很多。   单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。   适用性:当类...
  • u013256816
  • u013256816
  • 2016年03月23日 21:37
  • 4734

设计一个线程安全的单例(Singleton)模式

在设计单例模式的时候,虽然很容易设计出符合单例模式原则的类类型,但是考虑到垃圾回收机制以及线程安全性,需要我们思考的更多。有些设计虽然可以勉强满足项目要求,但是在进行多线程设计的时候。不考虑线程安全性...
  • gggg_ggg
  • gggg_ggg
  • 2015年12月08日 09:43
  • 1834

设计模式-单例模式(Singleton)各种写法和分析比较

介绍单例模式是设计模式中比较简单容易理解的。它的出现主要是: 保证一个类仅有一个实例,并提供一个访问它的全局访问点 其实就在系统运行期间中保证只有这么一个实例,并能够全局访问。应用场景就是当需要一...
  • Card361401376
  • Card361401376
  • 2016年05月07日 23:51
  • 3801

C++中实现singleton(单例模式)的最简单写法

前几天看了 Java中实现singleton的写法,就想在C++中实现一下,找了很多资料,看了各个牛人写的不同版本,但最后在stack overflow上找到了一个最简单的写法,现在贴出来以供参考: ...
  • flybird19870326
  • flybird19870326
  • 2014年03月04日 16:50
  • 1885

设计模式(创建型)之单例模式(Singleton Pattern)

单例模式可能是23种设计模式中最简单的。应用也非常广泛,譬如Android中的数据库访问等操作都可以运用单例模式。核心概念: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称...
  • yanbober
  • yanbober
  • 2015年04月27日 16:50
  • 2570

【GOF】单例模式singleTon的再认识

GoF中很经典的模式——单例模式。使用单例的目的是为了避免不一致问题,防止状态变化!简单说来就是,防止我们频繁初始化类的时候造成数据状态不一致的问题,通过单例模式可以保证类的唯一性。 ☆三大特性 ...
  • u010508826
  • u010508826
  • 2016年04月25日 20:18
  • 460

C#设计模式——单例模式(Singleton)

一、引言 最近在设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深...
  • ycl295644
  • ycl295644
  • 2015年07月06日 08:53
  • 2009

Ruby设计模式透析之 —— 单例(Singleton)

此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉Ruby语法的朋友请转阅 : Java设计模式透析之 —— 单例(Singleton) 写软件的时候经常需要用到打印日志功能,可以...
  • sinyu890807
  • sinyu890807
  • 2013年04月30日 09:27
  • 14455

设计模式之——单例模式(Singleton)的常见应用场景

单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此...
  • likika2012
  • likika2012
  • 2013年09月09日 16:43
  • 48572
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式C++描述----01.单例(Singleton)模式
举报原因:
原因补充:

(最多只允许输入30个字)