单例模式----懒汉+饿汉

原创 2013年12月06日 12:36:59
单例模式:
     特点:仅有一个实例
     实现:声明构造函数析构函数为私有,声明一个静态函数来创建和调用该实例。
     分类:懒汉模式,饿汉模式
     扩展:仅生成指定数量的实例

解决问题的一般方法:
     从易到难,根据简单的实例理解问题的大致解决方法以及实现
     -->再逐步加深难度,深入理解该问题的难点(人与人不同,难点也略有不同)
     --->自己动手实现一遍
     ----->整理思路,找到解决问题的核心点
     ----->找到该问题的产生背景,以及应用范围
(本人能力有限,无法达到以上要求,哎,希望大能指点,共同进步。)

     单例模式代码:

懒汉模式:延迟加载,什么时候用什么时候加载。

//单例模式------懒汉模式
#include <iostream>
using namespace std;

class Singleton {
public:
                 static Singleton * singleInstance(){
                                 if ( pSingleton == NULL ){
                                                 return pSingleton = new Singleton();
                                }
                                 return pSingleton ;
                }

                 void destorySingleton ()
                {
                                 delete pSingleton ;
                                 pSingleton = NULL ;
                }

private:
                 static Singleton * pSingleton;
                 Singleton()
                {
                                 cout<<"My name is singleton!" <<endl;
                }
                ~ Singleton()
                {
                                 cout<<"good bye!" <<endl;
                }
};

Singleton* Singleton ::pSingleton = NULL;


int main ()
{
                 Singleton::singleInstance ();
                 Singleton::singleInstance ()->destorySingleton();
                 return 0 ;
}

缺点:
     懒汉模式是用时创建实例,我们注意到该类中有一个private static member :pSingleton ,当有多个静态成员的时候,尤其是该类实例依赖成员的初始化顺序时候,我们无法保证静态成员的初始化顺序,这由编译器的“心情”决定:想先创建那个就先创建那个静态实例。
     当单例模式类实例化的时候,如果对静态成员有次序要求,则会出现意想不到的结果,往往在某一个关键时刻给你一个“惊喜”,比如程序上次运行明明很好,但是这次刚刚启动就崩溃了。这是由于静态数据的初始化时没有次序的,这要看编译器的“心情”,想先初始化哪个就初始化哪个。程序员最讨厌不确定了,喜欢程序按部就班的执行,严格按照指令,一步一步执行。
     在多线程的时候,可能实例化多个类实例。这需要加锁。(这里留下一个待执行任务:详述一下锁的机制

饿汉模式:程序执行时立即初始化实例,不用等到用时候再初始化。
//单例模式------饿汉模式
#include <iostream>
using namespace std;
class Singleton {
public:
                 static Singleton & singletonInstance (){
                                 static Singleton s;
                                 return s ;
                }
private:
                 Singleton(){
                                 cout<<"我是饿汉模式" <<endl;
                }
                ~ Singleton(){
                                 cout<<"饿汉模式走了,挥一挥手,不留下一片云彩。" <<endl;
                }
                 static int a;
};

int main ()
{
                 Singleton::singletonInstance ();
                 return 0;
}


优点:
     节省堆栈空间,静态数据放在全局数据区。局部静态成员第一次使用时候初始化,即初始化次序可控。可像懒汉模式一样,等到用时候再初始化。
注意:
     两个类不可相互引用。多线程中,由于类的构造函数不是原子操作,我们在初始化类的时候还是要加锁(未完成:哪些操作是原子操作)。


扩展:
     有时候我们需要实例化的对象有上限,即实例化对象个数可控。

     使用信号量解决(未完成:进程间通信)。

参考:http://blog.yangyubo.com/2009/06/04/best-cpp-singleton-pattern/
          http://blog.csdn.net/lingfengtengfei/article/details/12347089



单例模式的五种写法:懒汉/饿汉/双重检验锁/静态内部类/枚举

单例模式算是设计模式中最容易理解,也是最容易手写代码的模式了吧。但是其中的坑却不少,所以也常作为面试题来考。本文主要对几种单例写法的整理,并分析其优缺点。很多都是一些老生常谈的问题,但如果你不知道如何...

单例模式有五种写法:懒汉、饿汉、双重检验锁、静态内部类、枚举。

设计模式分类: 1:创建型模式: 单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式; 2:结构型模式: 适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式 3:行为型模式: ...

C++单例模式,懒汉 饿汉

饿汉模式:线程安全 懒汉模式:非线程安全 #include using namespace std; class Singleton { private: Singleton() {} Sin...
  • lcxywfe
  • lcxywfe
  • 2017年02月28日 20:00
  • 195

【4月21日】单例模式:饿汉和懒汉

要写的话都在程序的注释里面写了,就不啰嗦了直接上代码!首先创建用于测试的饿汉模式的单例package com; /* * 单例模式 singleton * 应用场景:对象只需要一个就可以了,如日志...

C++单例模式(懒汉和饿汉)与线程安全

单例: 单例大约有两种实现方法:懒汉与饿汉。 懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化, 饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行...

单例模式有五种写法:懒汉、饿汉、双重检验锁、静态内部类、枚举

单例模式算是设计模式中最容易理解,也是最容易手写代码的模式了吧。但是其中的坑却不少,所以也常作为面试题来考。本文主要对几种单例写法的整理,并分析其优缺点。很多都是一些老生常谈的问题,但如果你不知道如何...

C++中的单例模式(懒汉、饿汉)

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

饿汉懒汉都是好汉——单例模式

前情回顾:     不知大家是否曾有过类似经历。在做机房收费的时候,单击菜单栏的某个按钮,click 一次便出现一次此窗体,从而导致一个主界面里出现过多相同的窗体,但理想状态是不管如何单击,一个主界...

单例模式(懒汉,饿汉)

单例模式:懒汉,饿汉,两种方式。

单例模式之饿汉VS懒汉

我的疑问和观点: 网上的各位大侠的普遍观点是“懒汉模式是为了在需要实例的时候再创建,可以节省内存的不必要占用。” 情况1:在该类中存在常用的静态方法或者其他静态成员,使用这些静态方法和成员的时候无...
  • xubo578
  • xubo578
  • 2011年06月28日 09:12
  • 7395
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单例模式----懒汉+饿汉
举报原因:
原因补充:

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