设计模式 - Singleton模式(单例模式)


作用:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

 

UML结构图: 

设计模式 - Singleton模式(单例模式) 

 

 解析:

Singleton模式其实是对全局静态变量的一个取代策略,上面提到的Singleton模式的两个作用在C++中是通过如下的机制实现的:

1)仅有一个实例,提供一个类的静态成员变量,大家知道类的静态成员变量对于一个类的所有对象而言是惟一的

2)提供一个访问它的全局访问点,也就是提供对应的访问这个静态成员变量的静态成员函数,对类的所有对象而言也是惟一的.在C++中,可以直接使用类

域进行访问而不必初始化一个类的对象.

下面的实现其实是Singleton的一个简单实现,并不是特别的通用,一般的,如果一个项目中需要使用到Singleton模式比较多的话,那么一般会实现一个Singl

eton的模板类,模板类的模板参数是需要采用Singleton模式的类下面的实现还是采用最简单的实现办法,起的是演示的作用


Singleton.h
 1 
 2  #ifndef SINGLETON_H
 3  #define  SINGLETON_H
 4 
 5  class  Singleton
 6  {
 7  public :
 8      Singleton(){};
 9       ~ Singleton(){};
10 
11       //  静态成员函数,提供全局访问的接口
12       static  Singleton *  GetInstancePtr();
13       static  Singleton  GetInstance();
14 
15       void  Test();
16 
17  private :
18       //  静态成员变量,提供全局惟一的一个实例
19       static  Singleton *  m_pStatic;
20  };
21 
22  #endif
23 

 

 

Singleton.cpp

 

 1 
 2  #include  " Singleton.h "
 3  #include  < stdlib.h >
 4 
 5  int  main()
 6  {
 7       //  不用初始化类对象就可以访问了
 8      Singleton::GetInstancePtr() -> Test();
 9      Singleton::GetInstance().Test();
10 
11      system( " pause " );
12 
13       return   0 ;
14  }

 

 

如果用模板类来实现,可以参考如下代码:

 

Singleton.h
 1  template < class  T >
 2  class  Singleton
 3  {
 4  public :
 5       static  T &  getInstance();
 6 
 7  protected :
 8      Singleton()                {}
 9       virtual   ~ Singleton()    {}
10 
11  private :
12       //  防止拷贝复制
13      Singleton( const  Singleton & );
14      Singleton &   operator   =  ( const  Singleton & );
15  };
16 
17  //  取得实例
18  template < class  T >
19  T &  Singleton < T > ::getInstance()
20  {
21       static  T instance;     //  局部静态对象
22       return  instance;
23  }

 

 

Main.cpp
#include  " Singleton.h "
#include 
< stdlib.h >

//  需要采用singleton模式的类
class  Test
    : 
public  Singleton < Test >
{
    
//  类的声明
public :
    
void  DoTest();
};

int  main()
{
    
//  不用初始化类对象就可以访问了
    Test::getInstance().DoTest();

    system(
" pause " );

    
return   0 ;
}

 

 

你可能感兴趣的:(Singleton)