单例设计模式

---->单例设计模式 --->可以将singleton 改成相应的名字。
主要作用:是可以用来替换全局变量。全局唯一的。
使用场景:配置文件的读取、词典类的实现,日至系统的输出对象

自己的理解:
//单例设计模式,用来替代全局变量,并且该内存中只应有一个对象
//分析:只能有一个对象,首先在类之外肯定不定义其他对象,故这个唯一的一个对象,必定在类之内去定义好,类之外只要访问这个对象即可,于是,构造函数,必须放在private私有区,类之外,不能调用 构造函数,创建第二个对象,但是,类之外需要去访问这唯一的一个对象,而类之外一个对象有没有,不能通过对象的成员操作符去访问,只有通过类的静态函数去访问它,并且在类内部,我们为了不创建新的对象,我们就需要将这个创建的唯一的对象,通过静态成员(具有全局变量的生命周期,在程序结束时,才销毁)去保存这个地址,当我们去访问时,只要,地址值非NULL空,说明此时,已经存在了这个唯一的对象,我们不创建,只返回这个唯一的对象的地址给类之外的定义的指针即可。由此保证了其唯一性。

  • 要求:由该类只能生成唯一的对象。即要禁止在类外部定义一个对象,但要创建一个对象,即要在类之外去执行构造函数的,故将构造函数放在private 中,便不能在类之外调用构造函数创建多个对象,---> 该对象不能是栈对象。该对象只能是堆对象,
  • //实现步骤:                                                               1. 将构造函数私有化。
  • 2. 在类中定义一个静态的指针对象(可为私有,可为公有),并在类外初始化为空
  • 3. 定义一个返回值为类指针的静态成员函数,


getInstance 函数并不是线程安全函数。 _pInstance=NULL  --称为懒汉式/饿汉式(懒加载),
如果直接 _pInstance=getInstance( )  //饱汉式(可以保证它线程安全的)
如果任然用懒汉式。

4、函数atexit( ) ----> 注册的函数在main函数退出时,会执行。
  1. 静态成员函数
  2. 嵌套类+静态对象
  3. 局部静态变量。
  4. 利用函数atexit( )函数+饱汉式                        通过atexit(destory( ) )
  5. 针对LInux的接口的,即,pthread_once( pthread_once_t  ,函数指针)   结合atexit( )函数,+懒汉式,完美解决问题,   


#include
   
   
    
     

#include 
    
    
     
     
using std::cout;
using std::endl;

//让单例类对象自动释放
//版本一: 静态对象 + 嵌套类
class Singleton 
{
    private:
        class AutoRelease
        {
            public:
                ~AutoRelease()
                {
                    cout<<"~AutoRelease()"<
     
     
    
    
   
   

#include
     
     
      
      

#include 
      
      
       
       
using std::cout;
using std::endl;

//如果不想用嵌套类,还要求自动释放
//版本二:atexit + 饱汉式 
//atexit() 函数的特性是,在程序结束时去执行其注册函数,有几次执行几次

class Singleton 
{
    public:
        static Singleton * getInstance()
        {
            if(NULL==_pInstance)
            {   
                //注意这儿只会运行一次
                _pInstance=new Singleton();
                atexit(destory);
            }
            return _pInstance;
        }
        static void destory()
        {
            if(NULL!=_pInstance)
            {
                delete _pInstance;

            }
        }
    private:
        Singleton(){cout<<"Singleton()"<
       
       
      
      
     
     

#include
       
       
        
        

#include 
        
        
         
         
using std::cout;
using std::endl;

//版本三:atexit + pthread_once + 饿汉式
//可以保证多线程安全的

class Singleton 
{
    public:
        static Singleton *getInstance()
        {
            pthread_once(&_once,init);
            return _pInstance;
        }
        static void init()
        {
            _pInstance=new Singleton();
            atexit(destory);
        }
        static void destory()
        {
            if(NULL!=_pInstance)
                delete _pInstance;
        }
    private:
        ~Singleton(){ cout<<"~Singleton()"<
         
         
        
        
       
       




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smilejiasmile

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值