阿Sam的设计模式学习笔记----Singleton模式

本文介绍了单例模式的基本概念,包括其功能、基本思想及适用场景。详细解释了单例模式的实现方式,如如何保证一个类只有一个实例并提供全局访问点,以及如何通过子类化扩展单例模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,功能:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2,基本思想:让类自身负责保存它的唯一实例。这个类保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
3,适用情况:
  • 当类只能有一个实例,而且客户可以从一个众所周知的访问点访问它;
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例。
4,案例举例
线程池,数据库连接池,系统参数配置,Calendar,以及偶即将总结的抽象工厂”Abstract Factory”,等等。
5,结构
 
6, 优点
A. Singleton类封装它的唯一实例,所以它可以严格控制客户访问它的方法和时机;
B. Singleton类可以被继承,其子类可以实现对操作的扩展,从而对具体的应用进行扩展;
C. Singleton是全局变量的改进,它的实例全局可见;同时,同一个类型的对象只会有一个实例(当然,可以多定义几个静态变量,生成多个实例,但是显而易见,生成多少个实例完全是偶们可以控制的);而且,Singleton对象可以在使用时才创建,不需要像全局对象一样,不管你用不用都得创建。
7, 实现:
1)最简单的Singleton
 
2Singleton的子类继承

   
   
class  Singleton
{
public
:
  
//
 Static 成员不能是虚函数,不能多态实现,因此Instance的实现不能在基类中
  
// static Singleton * Instance();

protected :
  Singleton(){}
private
:
  
static Singleton *
 m_instance;
private

  Singleton(
const Singleton &
);
  Singleton 
& operator=(const Singleton &
);
};
Singleton 
* Singleton::m_instance =
 NULL;

class ChildSingleton : public
 Singleton
{
public
:
  
static Singleton *
 Instance();
protected
:
  ChildSingleton(){}
};
  Instance()的实现注意到底返回父类的实例还是子类的实例,若返回父类的实例:

 
 
Singleton  *  ChildSingleton::Instance()
{
  
if  (m_instance  ==  NULL)
    m_instance 
=   new  Singleton();
  
return  m_instance;
}
如果返回子类的实例:

 
 
Singleton  *  ChildSingleton::Instance()
{
  
static  ChildSingleton  *  m_instance;  // 定义一个子类的实例的static指针
   if  (m_instance  ==  NULL)
    m_instance 
=   new  ChildSingleton();   // 创建子类实例
   return  m_instance;   //  返回子类实例
}
下面的方法比较牛,兼武当与少林之所长:

   
   
template  < class  T >
class  Singleton
{
public :
  
static  T  *  Instance() 
  {
    
static  T m_instance;   //  定义需要返回的实例,不必将其定义为成员
     return   &  m_instance;
  }
protected :
  Singleton(){}
private :
  Singleton(
const  Singleton  & );
  Singleton 
&  operator = ( const  Singleton  & );
};
3)《设计模式》中创建Singleton子类的讨论:
    主要问题是如何建立子类的唯一实例。比较灵活的方法是使用一个Singleton注册表,可能的Singleton类及其子类集合不是由Instance定义的,Singleton类可以根据名字在一个众所周知的注册表中注册其实例。这个注册表在字符串名和Singleton及其子类之间建立映射。当Instance()需要一个Singleton实例时,它参考注册表来请求实例。
A,在类的构造函数中“注册”该类(可能用链表,数组等等来完成“注册表”的功能)。
BInstance()成员函数负责在“注册表”中查找需要创建什么实例,然后创建它。通常,这需要一个类工厂来完成。
    具体的东东可以参考book…….偶偷懒了…… 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值