• 单列模式


    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;
  • 相关阅读:
    IIS是如何处理ASP.NET请求的
    c# Socket通讯中关于粘包,半包的处理,加分割符
    windows2008(64位)下iis7.5中的url伪静态化重写(urlrewrite)
    C#微信公众号/订阅号开发 接口源码
    C#线程池多线程Socket通讯 服务器端和客户端示例
    百度地图JS调用示例
    c# 图片转二进制/字符串 二进制/字符串反转成图片
    电商项目面试总结
    96. Unique Binary Search Trees
    92.Reverse Linked List II
  • 原文地址:https://www.cnblogs.com/LifeoFHanLiu/p/9948309.html
Copyright © 2020-2023  润新知