设计模式学习之单件模式singleton

定义

      单件模式是一种用于确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享的程序设计方法(根据实际情况,可能需要几个类实例)。在某些情况下,这种程序设计方法是很有用处的。

单件模式应该使用在什么场合

    当需要控制一个类的实例数量且调用者可以从一个公共的众所周知的访问点访问时。

单件模式类的创建

    我们分两种方式来讨论一个单件类的创建,一是将一个类的公共构造函数改为私有,另一种方式是保留类的公共构造函数,通过一个静态成员来决定是否要返回一个类实例。

应用

    顾名思义,Singleton就是确保一个类只有唯一的一个实例。Singleton主要用于对象的创建,这意味着,如果某个类采用了Singleton模式,则在这个类被创建后,它将有且仅有一个实例可供访问。很多时候我们都会需要Singleton模式,最常见的比如我们希望整个应用程序中只有一个连接数据库的Connection实例;又比如要求一个应用程序中只存在某个用户数据结构的唯一实例。我们都可以通过应用Singleton模式达到目的。

为什么不使用全局对象

    一眼看去,Singleton似乎有些像全局对象。但是实际上,并不能用全局对象代替Singleton模式,这是因为:其一,大量使用全局对象会使得程序质量降低,而且有些编程语言例如C#,根本就不支持全局变量。其二,全局对象的方法并不能阻止人们将一个类实例化多次:除了类的全局实例外,开发人员仍然可以通过类的构造函数创建类的多个局部实例。而Singleton模式则通过从根本上控制类的创建,将"保证只有一个实例"这个任务交给了类本身,开发人员不可能再有其它途径得到类的多个实例。这一点是全局对象方法与Singleton模式的根本区别。

Singleton模式的实现要点

  1. 不直接用类的构造函数,而另外提供一个Public的静态方法来构造类的实例。通常这个方法取名为Instance。Public保证了它的全局可见性,静态方法保证了不会创建出多余的实例
  2. 将类的构造函数设为Private,即将构造函数"隐藏"起来,任何企图使用构造函数创建实例的方法都将报错。这样就阻止了开发人员绕过上面的Instance方法直接创建类的实例。

李林老师的例子

头文件:

 1 class CLLog
2 {
3 public:
4 static CLLog* GetInstance();
5
6 private:
7 CLLog(const CLLog&);//复制构造函数
8 CLLog& operator=(const CLLog&);//"="操作符
9
10 CLLog();
11 virtual ~CLLog();
12
13 int m_Fd;//记录文件描述符
14 static CLLog *m_pLog;
15 };

实现文件:

 1 CLLog* CLLog::m_pLog = 0;//静态成员初始化
2
3 CLLog::CLLog()
4 {
5 m_Fd = open(LOG_FILE_NAME, O_RDWR | O_CREAT | O_APPEND, S_IRUSR);
6 }
7
8 CLLog::~CLLog()
9 {
10 if(m_Fd != -1)
11 close(m_Fd);//析构时关闭文件
12
13 if(m_pLog != 0)
14 delete m_pLog;//释放业务对象占用的资源
15 }
16
17 CLLog* CLLog::GetInstance()
18 {
19 if(m_pLog == 0)
20 {
21 m_pLog = new CLLog;
22 }
23 return m_pLog;
24 }

一点自己的理解,这个类可以分为两部分来看:一部分对外表现出静态(static)特性,负责类的初始化、内部业务对象的创建、释放等管理工作;另一部分就是内部业务对象,它是这个类提供的业务逻辑的实际执行者。

posted @ 2011-10-18 12:19  lq0729  阅读(298)  评论(0编辑  收藏  举报