关闭

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

标签: C++
600人阅读 评论(0) 收藏 举报
分类:


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模式的使用总结:

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





 

3
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

C++设计模式[二]单例模式

接着就是单例模式;个人理解就是把创建方法改为私有,然后再内部实例化,禁止外部创建对象。 何为单例模式,在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:保证一个类只有一个实例,并提供一个...
  • langb2014
  • langb2014
  • 2015-11-03 16:11
  • 1004

C++ 单例模式最佳实现

C++ Singleton (单例) 模式最优实现 written on Thursday, June 4, 2009 索引 静态化并不是单例 (Singleton) 模式饿汉模式懒...
  • tgxallen
  • tgxallen
  • 2017-05-14 23:00
  • 595

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

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

C++:单例模式例题解析

C++:单例模式例题解析标签:单例模式 队列by 小威威这篇博文主要是讲解例题,如要深入了解单例模式,可以参考这篇文章:C++设计模式——单例模式,我个人觉得写得不错。单例模式是C++设计模式中的一...
  • linwh8
  • linwh8
  • 2016-04-15 09:19
  • 839

单例模式(Singleton)- 最易懂的设计模式解析

前言今天我来全面总结一下Android开发中最常用的设计模式 - 单例模式。 关于设计模式的介绍,可以看下我之前写的:1分钟全面了解“设计模式” 目录1. 引入1.1 解决的是什么问题之前说过,设...
  • carson_ho
  • carson_ho
  • 2016-08-16 17:15
  • 3989

java设计模式之单例模式(几种写法及比较)

概念:   java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。   单例模式有以下特点:   1、单例类只能有一个实例。  ...
  • tolcf
  • tolcf
  • 2015-10-21 22:56
  • 6146

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

世界上只有一个中国,只有一个fujin
  • ApeLife
  • ApeLife
  • 2014-08-04 20:07
  • 1568

设计模式——单例模式的几种实现方式

1.饿汉式:静态常量 这种方法非常的简单,因为单例的实例被声明成static和final变量了,在第一次加载类到内存中时就会初始化,所以会创建实例本身是线程安全的。public class Singl...
  • bingogirl
  • bingogirl
  • 2016-09-01 00:03
  • 1177

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

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

C++工厂类和单例模式的结合使用

单例模式: 简单来说一个类只有一个实例且封装性好。这里用宏定义实现。animal_singleton.h#pragma once #include #define IMPLEMENTION_SING...
  • baidu_34788529
  • baidu_34788529
  • 2016-05-26 21:42
  • 899
    个人资料
    • 访问:486321次
    • 积分:7900
    • 等级:
    • 排名:第3075名
    • 原创:319篇
    • 转载:43篇
    • 译文:5篇
    • 评论:30条
    博客专栏
    最新评论
    大数据
    大数据2.0,将创造出更新更具竞争力的超级企业!
    云计算
    资源整合和企业成本节约的一把利器!
    IT项目管理
    合理配置规划和整合资源,利用最少的资源,打造高效的开发团队,使产出智能化,数量化,自动化!创造最大的价值!