第二十一章-单例模式

时间:2019-12-14
本文章向大家介绍第二十一章-单例模式,主要包括第二十一章-单例模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

单例模式(Singleton): 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的办法。

基本代码

懒汉模式

#include<iostream>
#include<string>
#include<vector>

using namespace std;

class Singleton
{
private:
    static Singleton* instance;

    Singleton() {}

public:
    static Singleton* GetInstance()
    {
        if (instance == nullptr)
        {
            instance = new Singleton();
        }

        return instance;
    }
};
Singleton* Singleton::instance = nullptr;



int main()
{
    Singleton* s1 = Singleton::GetInstance();
    Singleton* s2 = Singleton::GetInstance();

    if (s1 == s2)
    {
        cout << "两个对象是相同的" << endl;
    }


    system("pause");
    return 0;
}

多线程双重锁定版本

#include<iostream>
#include<string>
#include<vector>
#include<thread>
#include<mutex>

using namespace std;

#include<iostream>
#include<string>
#include<vector>

using namespace std;

class Lock
{
private:
    mutex mut;
public:
    void lock() { mut.lock(); }
    void unlock() { mut.unlock(); }
};
class Singleton
{
private:
    
    static Singleton* instance;
    static Lock* locker;

    Singleton() {}

public:
    static Singleton* GetInstance()
    {
        if (instance == nullptr)
        {
            locker->lock();
            if(instance == nullptr)
                instance = new Singleton();
            locker->unlock();
        }

        return instance;
    }
};
Singleton* Singleton::instance = nullptr;
Lock* Singleton::locker = new Lock();



int main()
{
    Singleton* s1 = Singleton::GetInstance();
    Singleton* s2 = Singleton::GetInstance();

    if (s1 == s2)
    {
        cout << "两个对象是相同的" << endl;
    }


    system("pause");
    return 0;
}

饿汉模式

饿汉模式与懒汉模式相反,是程序一开始就生成唯一实例。这样就不用检查是否存在实例,而且也无需考虑产生实例时的线程安全。

#include <iostream>

using namespace std;

class Singleton {
public:
    ~Singleton();
    //提供单例对象访问
    static Singleton* getInstance();
    void doSomething();
protected:
    //构造函数声明为 保护方法
    Singleton();
    //单例对象指针
    static Singleton* theSingleton;
};

//提供单例类对象访问
Singleton* Singleton::getInstance() {
    return theSingleton;
}

void Singleton::doSomething()
{
    cout << "饿懒汉模式" << "\n" << "单例模式" << endl;
}

Singleton::Singleton()
{
}
Singleton::~Singleton()
{}

Singleton* Singleton::theSingleton = new Singleton();

int main()
{
    Singleton* s1 = Singleton::getInstance();
    Singleton* s2 = Singleton::getInstance();

    if (s1 == s2)
    {
        cout << "两个对象是相同的" << endl;
    }

    system("pause");
    return 0;
}

Meyers Singleton(目前最推荐的C++单例写法)

#include <iostream>

using namespace std;

class Singleton
{
public:
    static Singleton& Instance()
    {
        static Singleton theSingleton;
        return theSingleton;
    }
    void doSomeThong();
private:
    Singleton();
    ~Singleton();
};

Singleton::Singleton()
{
}

Singleton::~Singleton()
{
}
void Singleton::doSomeThong()
{
    cout << "单例类" << endl;
    cout << "C++最推荐的单例类写法" << endl;
}

int main()
{
    Singleton::Instance().doSomeThong();

    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/wfcg165/p/12040567.html