C++单例模式详解--设计模式(1)

原创 2016年06月05日 19:38:55


Singleton模式来源:         

       单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,"阻止"所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。

Singleton模式作用:

       对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。

      显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

 从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

      单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例

Singleton模式示例代码如下:

class CSingleton

{
private:
CSingleton() //构造函数是私有的
{

}
public:
static CSingleton * GetInstance()
{
static CSingleton *m_pInstance;
if(m_pInstance == NULL) //判断是否第一次调用
m_pInstance = new CSingleton();
return m_pInstance;
}
         用户访问唯一实例的方法只有GetInstance()成员函数。如果不通过这个函数,任何创建实例的尝试都将失败,因为类的构造函数是私有的。GetInstance()使用懒惰初始化,也就是说它的返回值是当这个函数首次被访问时被创建的。

         一般Singleton模式通常有三种形式:

第一种形式:懒汉式,也是常用的形式,什么时候用,再创建,不会出现空耗内存的情况。

/*testcode1*/
#include <iostream>
using namestd std;
class Singleton{
public:
    static  Singleton& getInstance(void){
         if(! s_instance)
            s_instance = new Singleton;
          return *s_instance;//不用Singleton,就不创建。
}
private:
    Singleton (void){}
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);
    static Singleton* s_instance;
};
Singleton* Singleton::s_instance=NULL;
int main (void){
     Singleton& s1 = Singleton::getInstance ();
     Singleton& s2 = Singleton::getInstance ();
     cout << &s1 << ' '<< &s2 << ' '<< endl;
     return  0;
}

第二种形式:饿汉式,进程一起来,s_instance就存在了,先于main函数构造。

#include <iostream>
using namestd std;
class Singleton{
public:
    static  Singleton& getInstance(void){
          return s_instance;
}
private:
    Singleton (void){}
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);
    static Singleton s_instance;
};
Singleton Singleton::s_instance;
int main (void){
     Singleton& s1 = Singleton::getInstance ();
     Singleton& s2 = Singleton::getInstance ();
     cout << &s1 << ' '<< &s2 << ' '<< endl;
     return  0;
}

Singleton模式适用场景:

        单例模式常常与工厂模式结合使用,因为工厂只需要创建产品实例就可以了,在多线程的环境下也不会造成任何的冲突,因此只需要一个工厂实例就可以了。

Singleton模式优缺点总结:

Singleton模式优点:

1.减少了时间和空间的开销(new实例的开销)。

2.提高了封装性,使得外部不易改动实例。

 Singleton模式缺点:

1.懒汉式是以时间换空间的方式。

2.饿汉式是以空间换时间的方式。

Singleton模式的使用总结:

         从上可见,单例模式是最简单的一种设计模式,在实际应用中,有一些对象其实只需要一个,比如:线程池,缓存,对话框,处理偏好设置和注册表的对象,日志对象,充当打印机,显卡等设备的驱动程序对象。这些对象只能够拥有一个实例,如果创建出了多个实例,就会导致一些程序的问题。程序的行为异常,资源使用的过量,或者导致不一致的结果。常用来管理共享的资源,比如数据库的连接或者线程池。





 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C++设计模式(1)-单例模式

资料来源:设计模式精解-GoF 23 种设计模式解析附 C++ 共23种经典设计模式,分类如下: 以及剑指offer中2.2.2的详细讲解。单例模式的特点: 1、该类只有一个实例 2、该...

C++单例设计模式,单例模式

  • 2009年10月20日 17:36
  • 733B
  • 下载

java设计模式之单例模式详解

  • 2012年11月02日 17:53
  • 33KB
  • 下载

Android设计模式(1)----单例模式

在很多设计模式中,我相信大多数程序猿最早接触的设计模式就是单例模式啦,当然了我也不例外。单例模式应用起来应该是所有设计模式中最简单的。单例模式虽然简单,但是如果你去深深探究单例模式,会涉及到很多很多知...

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了...

设计模式——单例模式(1)

上三篇文章都是在讲工厂模式,这篇就跟吉哥一起学习最常用的模式——单例模式。   概念:在它的核心结构中只包含一个被称为单例的特殊类。   分类:单例模式的形式也比较多,包涵以下8种(这里是把懒...

java设计模式1 单例模式

设计模式的目的:是经验总结,为了可重要代码。 分为三类:创建者模式: 单例  工厂方法  抽象工厂  建造者  原型     结构型模式: 适配器  装饰器  代理        桥接 组合 享元  ...

设计模式(1) 单例模式--创建型

单例模式:确保一个类只有一个实例,并提供一个全局访问点。

学习笔记——JAVA设计模式<1>单例模式

Group of four GFO23种设计模式 创建型模式建对象 单例模式 工厂模式 抽象工厂模式 建造者模式原型模式 结构性模式 适配器模式 桥接模式 装饰模式 组合模式...

设计模式(1)——单例模式

原文地址:http://blog.jobbole.com/78059/ 单例模式也就是保证一个类只有一个实例的一种实现方法; 应用场景:  单例模式的使用自然是当我们的系统中某个对象只需要一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++单例模式详解--设计模式(1)
举报原因:
原因补充:

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