单列模式

Posted lifeofhanliu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单列模式相关的知识,希望对你有一定的参考价值。

1.单列模式的定义

保证一个类只有一个实例存在,同时提供能对该实例加以访问的静态方法。

2.为什么要使用单列模式

在整个程序空间使用全局变量,共享资源;

大规模系统中,为了性能的考虑,需要节省对象的创建时间等。

3.实现单列模式的步骤

a)  构造函数私有化

b)  提供一个公有的静态方法

c)  在类中定义一个指向本类静态变量指针

4.单列模式的分类

a)懒汉式

懒得给你new对象,等你需要的时候再new;

缺点:当懒汉式遇上多线程时,需要考虑线程同步问题,因为可能出现多个线程同时创建对象的问题,这样就导致单列模式名存实亡,因为单列模式需要保证一个类只有一个实列存在。

优点:节省内存空间,需要时才分配。

b)饿汉式

管你需不需要,我先把对象给你new出来再说。

缺点:浪费空间。

优点:当饿汉式遇上多线程,不需要考虑线程同步问题,因为对象已经事先new出来了。

5.代码实现

5.1懒汉式

#include <iostream>
using namespace std;
//懒汉式
class Singelton
{
private:
    Singelton()
    {
        cout << "Singelton 构造函数执行" << endl;
    }
    static Singelton *m_psl;
public:
    static Singelton *getInstance()
    {
        if (m_psl == NULL)
        {
            m_psl = new Singelton;
        }
        return m_psl;
    }

    static void FreeInstance()
    {
        if (m_psl != NULL)
        {
            delete m_psl;
            m_psl = NULL;
        }
    }
};
Singelton *Singelton::m_psl = NULL;//先初始化为空,等需要的时候再new

void test()
{

    Singelton *p1 = Singelton::getInstance();
    Singelton *p2 = Singelton::getInstance();

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

void main()
{
    test();
    system("pause");
}

5.2饿汉式

#include <iostream>
using namespace std;
//饿汉式
class Singelton
{
private:
    Singelton()
    {
        cout << "Singelton 构造函数执行" << endl;
    } 

  static Singelton *m_psl;
public:
    static Singelton *getInstance()
    {
        return m_psl;
    }

    static void FreeInstance()
    {
        if (m_psl != NULL)
        {
            delete m_psl;
            m_psl = NULL; 
        }
    }
};//饿汉式
Singelton *Singelton::m_psl = new Singelton;

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

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

void main()
{
    test();
    system("pause");
}

5.3懒汉式遇上多线程

#include <iostream>
#include<pthread.h>
using namespace std;
//懒汉式+多线程
class Singelton
{
private:
    Singelton()
    {
        cout << "Singelton 构造函数执行" << endl;
    }
    static Singelton *m_psl;
    static pthread_mutex_t mutex;
public:
    static Singelton *getInstance()
    {
        if (m_psl == NULL)//使用两次判断,避免平凡的加解锁造成不必要的开销
        {
            pthread_mutex_lock(&mutex);
            if (m_psl == NULL)
            {
                m_psl = new Singelton;
            }
            pthread_mutex_unlock(&mutex);
        }
        return m_psl;
    }

    static void FreeInstance()
    {
        if (m_psl != NULL)
        {
            delete m_psl;
            m_psl = NULL;
        }
    }
};
Singelton *Singelton::m_psl = NULL;
pthread_mutex_t Singelton::mutex;

 



以上是关于单列模式的主要内容,如果未能解决你的问题,请参考以下文章

单列模式

3.单列模式

创建类设计模式-单列模式基于metaclass方法实现.py

单列模式下的数据库连接与Servlet之间页面访问用户登录的小例子

单列模式

单列模式