单例模式常用写法

1. 分类

懒汉模式 - 加载模块时就创建
饿汉模式 - 当调用getInstance()时,才创建对象

2. 单例模式的特点:

私有的构造函数, 拷贝构造函数,以及operator=, 保证其不能够在类的外部进程对象构造,拷贝等操作。
getInstance是一个公有的静态成员函数,用来构造这个类唯一的实例对象m_instance, 并且返回给使用者。

3. 单例的几种写法

----> a.懒汉模式

单例模式 -- C++_#include

----> b.饿汉模式

单例模式 -- C++_单例模式_02

----> c.线程安全模式

单例模式 -- C++_饿汉模式_03

----> c.单例模板

单例模式 -- C++_单例模式_04

再写一个A类来测试:

#ifndef _A_HPP_
#define _A_HPP_

#include <iostream>

using namespace std;

class A
{
public:
    A();
    ~A();

    int getA() const;
    void setA(const int v);

private:
    int m_a;
};

#endif

#include "A.hpp"

A::A()
{
    cout << "A create." << endl;
}

A::~A()
{
    cout << "A destroy." << endl;
}

int A::getA() const
{
    return m_a;
}

void A::setA(const int v)
{
    cout << "Set " << v << " Successful." << endl;
    m_a = v;
}

其中main函数如下调用:

int main(int argc, char *argv[])
{

    singleton *s1 = singleton::getInstance();
    singleton *s2 = singleton::getInstance();

    cout << "饿汉模式 S1 == S2 ? --> " << (s1 == s2) << endl;

    singleton2 *s3 = singleton2::getInstance();
    singleton2 *s4 = singleton2::getInstance();

    cout << "饿汉模式 S3 == S4 ? --> " << (s3 == s4) << endl;

    singleton3 *s5 = singleton3::getInstance();
    singleton3 *s6 = singleton3::getInstance();

    cout << "线程安全 S5 == S6 ? --> " << (s5 == s6) << endl;

    A *a = singletonTemplate<A>::getInstance();
    a->setA(99);

    A *b = singletonTemplate<A>::getInstance();
    int value = b->getA();

    cout << "单例模板 测试class A,获得value = " << value << endl;

    return 0;
}

执行:
单例模式 -- C++_#include_05