码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2016-12-23 23:19:50      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:单例模式   饿汉式   懒汉式   

1、单例模式

  单例模式:一个类只能创建一个对象
  为什么使用单例模式:
  在多个线程之间,初始化一次socket资源,对资源进行共享

2、实现单例的步骤:
  (1)、构造函数私有化
  (2)、提供一个全局的静态方法
  (3)、在类中定义一个静态指针,指向本类的变量的静态指针变量!!!


3、单例模式---懒汉式

  (1)、代码实现

#include<iostream>
using namespace std;

class Singelton{
    private:
        Singelton(){
            cout<<"Singelton 构造函数执行"<<endl;
        }   
    public:
        static Singelton *getInstance(){
            if(m_psl == NULL){
                m_psl = new Singelton;  //申请了一个对象的入口地址;
            }   
            return m_psl;
        }   
        static void freeInstance(){
            if(m_psl){
                cout<<"释放对象空间"<<endl;
                delete m_psl;
                m_psl = NULL;
            }
        }
    private:
        static Singelton *m_psl; //静态变量,必须在类外进行初始化,此时才会分配内存空间!!!
};

Singelton *Singelton::m_psl = NULL;

int main(void){
    Singelton *p1 = Singelton::getInstance();
    Singelton *p2 = Singelton::getInstance();

    if(p1 == p2){
        cout<<"是同一个对象"<<endl;
    }else{
        cout<<"不是同一个对象"<<endl;
    }

    Singelton::freeInstance();
    return 0;
}

  (2)、运行结果

技术分享

  (3)、懒汉式:

  懒汉式:只有在调用相应的方法时,才会构造对象!!!
  缺点:每次都要进行判断,程序进行慢! 

  (4)、懒汉式存在的一个问题:

  i、懒汉式遇上多线程,此时就不能保证是单例模式了,可能会创建多个对象,解决方案:同步加锁、解锁机制!
  ii、构造函数不是线程安全函数!--->进行线程同步,保证只有一个线程去调用构造函数.其它的线程都要等待,才能保证只构造一个对象! 


4、单例模式---饿汉式

  (1)代码实现

#include<iostream>
using namespace std;

class Singelton{
    private:
        Singelton(){
            cout<<"Singelton 构造函数执行"<<endl;
        }   
    public:
        static Singelton *getInstance(){
            return m_psl;
        }   
        static void freeInstance(){
            if(m_psl){
                cout<<"释放对象空间"<<endl;
                delete m_psl;
                m_psl = NULL;
            }   
        }   
    private:
        static Singelton *m_psl; //此时C++编译器并没有分配内存!!!
};

Singelton *Singelton::m_psl = new Singelton;

int main(void){
    cout<<"*********************"<<endl;  //执行顺序:先执行静态变量的初始化(此时也就是构造函数),在执>
行主函数中的代码!!!
    Singelton *p1 = Singelton::getInstance();
    Singelton *p2 = Singelton::getInstance();

    if(p1 == p2){
        cout<<"是同一个对象"<<endl;
    }else{
        cout<<"不是同一个对象"<<endl;
    }

    Singelton::freeInstance();
    return 0;
}

  (2)、运行结果

技术分享

  (3)、饿汉式:

  饿汉式:不管需不需要对象空间,都先提前布局好对象空间;
  缺点:可能存在内存空间的浪费!


5、还有个懒汉式多线程的代码没有实现,那是解决单例中同步问题的方法;




本文出自 “wait0804” 博客,请务必保留此出处http://wait0804.blog.51cto.com/11586096/1885628

单例模式

标签:单例模式   饿汉式   懒汉式   

原文地址:http://wait0804.blog.51cto.com/11586096/1885628

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!