zoukankan      html  css  js  c++  java
  • 单键模式

    从单例模式实现的角度考虑:

     1、总是避免第三方调用拷贝构造函数以及赋值操作符

     2、总是避免第三方调用构造函数

     3、尽量避免第三方调用析构函数

     4、总是需要一个静态方法用于全局访问

    .h文件:

    #pragma once
    /*****************************
    * @filename:    Singleton.h
    * @author:      kzf
    * @version:     1.0
    * @date:        2011/11/14 
    * @describe:    单键模式 保证唯一的实例
    如果你整个程序是单线程的,那么标准模式或Meyers单例模式是你最佳选择
    * @modification:无
    *****************************/
    
    
    //标准模式
    class CSingleton1
    {
    private:
        //构造函数及析构函数私有化
        CSingleton1();
        virtual ~CSingleton1();
    
    private:
        //防止拷贝构造 以及 赋值 操作
        CSingleton1(const CSingleton1 &ob);
        CSingleton1& operator=(const CSingleton1 &ob);
    private:
        static CSingleton1* m_pInstance;
    
    public:
        static CSingleton1* GetInstance();
        static void ReleaseInstance();
        void Print();
    };
    
    /**
    标准模式的优缺点:
    优点:
        属于“懒汉”单例模式,第一次调用GetInstance才分配内存,不调用则不分配内存
    缺点:
        1)GetInstance中每次需要判断是否=NULL
        2)由于指针动态分配,必须手动调用ReleaseInstance释放
        3)多线程不安全,有可能实例化多个内存对象
    **/
    
    
    
    //Meyers单例模式
    class CSingleton2
    {
    private:
        //构造函数及析构函数私有化
        CSingleton2();
        virtual ~CSingleton2();
    
    private:
        //防止拷贝构造 以及 赋值 操作
        CSingleton2(const CSingleton2 &ob);
        CSingleton2& operator=(const CSingleton2 &ob);
    private:
        int m_nTestNum;
    public:
        static CSingleton2& GetInstance();
        void Print();
    };
    /**
    Meyers单例模式的优缺点:
    优点:
        1)属于“懒汉”单例模式,第一次调用GetInstance才实例化
        2)GetInstance中不需要判断是否=NULL,效率提高
        3)使用对象不是指针分配内存,不会内存泄漏
        4)多线程下能确保实例化一个内存对象
    缺点:
        1)多线程下未真正意义上同步。
        这是因为C++中构造函数并不是线程安全的。
        C++中的构造函数简单来说分两步:
        第一步:内存分配
        第二步:初始化成员变量
    
        结论:Meyers方式虽然能确保在多线程中产生唯一的实例,但是不能确保成员变量的值是否正确.
    **/
    
    
    /**
    从单例模式实现的角度考虑:
    1、总是避免第三方调用拷贝构造函数以及赋值操作符
    2、总是避免第三方调用构造函数
    3、尽量避免第三方调用析构函数
    4、总是需要一个静态方法用于全局访问
    
    **/

    .cpp文件:

    #include "StdAfx.h"
    #include "Singleton.h"
    
    
    //----------------------标准模式----------------------------
    CSingleton1* CSingleton1::m_pInstance = NULL;
    
    CSingleton1::CSingleton1(void)
    {
        printf("Construct begin
    ");
        //假设各种变量的初始化操作,花费近1s时间 用Sleep进行模拟
        Sleep(1000); 
        printf("Construct end
    ");
    }
    
    CSingleton1::~CSingleton1(void)
    {
        printf("Destruct
    ");
    }
    
    CSingleton1::CSingleton1(const CSingleton1 &ob)
    {
        //
    }
    
    CSingleton1& CSingleton1::operator =(const CSingleton1 &ob)
    {
        if (&ob != this)
        {
        }
        return *this;
    }
    
    CSingleton1* CSingleton1::GetInstance()
    {
        if (NULL == m_pInstance)
        {
            m_pInstance = new CSingleton1;
        }
    
        return m_pInstance;
    }
    
    void CSingleton1::ReleaseInstance()
    {
        if (NULL != m_pInstance)
        {
            delete m_pInstance;
            m_pInstance = NULL;
        }
    }
    
    void CSingleton1::Print()
    {
        printf("print out CSingleton1
    ");
    }
    
    
    //----------------------Meyers单例模式----------------------------
    
    CSingleton2::CSingleton2(void)
    {
        m_nTestNum = 0;
        printf("Construct begin,testnum=%d
    ", m_nTestNum);
        //假设各种变量的初始化操作,花费近1s时间 用Sleep进行模拟
        Sleep(1000); 
    
        m_nTestNum = 100;
        printf("Construct end,testnum=%d
    ", m_nTestNum);
    }
    
    CSingleton2::~CSingleton2(void)
    {
        printf("Destruct
    ");
    }
    
    CSingleton2::CSingleton2(const CSingleton2 &ob)
    {
        //
    }
    
    CSingleton2& CSingleton2::operator =(const CSingleton2 &ob)
    {
        if (&ob != this)
        {
        }
        return *this;
    }
    
    CSingleton2& CSingleton2::GetInstance()
    {
        //使用局部静态变量方式,从而使之延迟到调用时实例化
        static CSingleton2 gInstance;
    
        return gInstance;
    }
    
    void CSingleton2::Print()
    {
        printf("print out CSingleton2 testnum=%d
    ", m_nTestNum);
    }
  • 相关阅读:
    Ember.js 入门指南——计算属性(compute properties)
    Ember.js 入门指南——扩展(reopen)
    Ember.js 入门指南——类的定义、初始化、继承
    Ember.js 入门指南——目录
    Ember.js 入门指南——{{action}} 助手
    ubuntu按转jdk
    ubuntu设置电脑作为wifi热点
    一步完成linux安装jdk
    GStreamer基础教程13
    GStreamer基础教程12
  • 原文地址:https://www.cnblogs.com/smile-smile/p/5129669.html
Copyright © 2011-2022 走看看