单例模式常用写法
1. 分类
懒汉模式 - 加载模块时就创建
饿汉模式 - 当调用getInstance()时,才创建对象
2. 单例模式的特点:
私有的构造函数, 拷贝构造函数,以及operator=, 保证其不能够在类的外部进程对象构造,拷贝等操作。
getInstance是一个公有的静态成员函数,用来构造这个类唯一的实例对象m_instance, 并且返回给使用者。
3. 单例的几种写法
----> a.懒汉模式
----> b.饿汉模式
----> c.线程安全模式
----> c.单例模板
再写一个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;
}
执行: