0 引言

0.1 目的

       本文档给出设计模式之——Singleton模式的简化诠释,并给出其C++实现

0.2 说明

Project

Design Pattern ExplanationBy K_Eckel

Authorization

Free Distributed but Ownership Reserved

Date

2005-04-05Cherry blossom is Beautiful

Test Bed

MS Visual C++ 6.0

0.3 参考

       在本文档的写作中,参考了以下的资源,在此列出表示感谢:

u       书籍

[GoF 2000]GoF,Design Patterns-Elements of Reusable Object-Oriented Software

Addison-Wesley 2000/9.

        [Martine 2003]Robert C.Martine, Agile Software Development Principles, Patterns, and Practices, Pearson Education, 2003.

0.4 联系作者

Author

K_Eckel

State

Candidate for Master’s Degree School of Computer Wuhan University

E_mail

frwei@whu.edu.cn 

2 Singleton模式

2.1 问题

       个人认为Singleton模式是设计模式中最为简单、最为常见、最容易实现,也是最应该熟悉和掌握的模式。且不说公司企业在招聘的时候为了考察员工对设计的了解和把握,考的最多的就是Singleton模式。

       Singleton模式解决问题十分常见,我们怎样去创建一个唯一的变量(对象)?在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,在面向对象和面向过程结合的设计范式(如C++中)中,我们也还是可以通过一个全局变量实现这一点。但是当我们遇到了纯粹的面向对象范式中,这一点可能就只能是通过Singleton模式来实现了,可能这也正是很多公司在招聘Java开发人员时候经常考察Singleton模式的缘故吧。

       Singleton模式在开发中非常有用,具体使用在讨论给出。

2.2 模式选择

       Singleton模式典型的结构图为:


2-1Singleton Pattern结构图

   Singleton模式的结构图中可以看到,我们通过维护一个static的成员变量来记录这

个唯一的对象实例。通过提供一个staitc的接口instance来获得这个唯一的实例。

2.3 实现

2.3.1 完整代码示例(code

       Singleton模式的实很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用C++实现,并在VC 6.0下测试运行)。

代码片断1Singleton.h
//Singleton.h

#ifndef _SINGLETON_H_
#define _SINGLETON_H_

#include <iostream>
using namespace std;

class Singleton
{
public:
 static Singleton* Instance();

protected:
 Singleton();

private:
 static Singleton* _instance;

};

#endif //~_SINGLETON_H_

代码片断2Singleton.cpp
//Singleton.cpp

#include "Singleton.h"

#include <iostream>
using namespace std;

Singleton* Singleton::_instance = 0;

Singleton::Singleton()
{
 cout<<"Singleton...."<<endl;
}

Singleton* Singleton::Instance()
{
 if (_instance == 0)
 {
  _instance = new Singleton();
 }

 return _instance;
}

代码片断3main.cp
//main.cpp

#include "Singleton.h"

#include <iostream>
using namespace std;


int main(int argc,char* argv[])
{
 Singleton* sgn = Singleton::Instance();

 return 0;
}

2.3.2 代码说明

       Singleton模式的实现无须补充解释,需要说明的是,Singleton不可以被实例化,因此我们将其构造函数声明为protected或者直接声明为private

2.4 讨论

       Singleton模式在开发中经常用到,且不说我们开发过程中一些变量必须是唯一的,比如说打印机的实例等等。

       Singleton模式经常和FactoryAbstractFactory)模式在一起使用,因为系统中工厂对象一般来说只要一个,笔者在开发Visual CMCS的时候,语义分析过程(以及其他过程)中都用到工厂模式来创建对象(对象实在是太多了),这里的工厂对象实现就是同时是一个Singleton模式的实例,因为系统我们就只要一个工厂来创建对象就可以了。

Posted on 2005-07-08 21:07  k_eckel's mindview  阅读(489)  评论(0编辑  收藏  举报