单例模型
饿汉模式:
#include <iostream>
using namespace std;
class A
{
public:
static A& instance()
{
struct B
{
A a;
B()
{
a.show();
}
};
static B b;
return b.a;
}
void show()
{
cout << "hello" << endl;
}
private:
A(){}
};
int main()
{
cout << "sdf" << endl;
A &m = A::instance();
return 0;
}
懒汉模式:
#include <iostream> using namespace std; class A { public: static A* instance() { if (a == NULL) { a = new A; a->show(); } return a; } void show() { cout << "hello" << endl; } private: static A *a; A(){} }; A * A::a = NULL; int main() { cout << "sdf" << endl; A *m = A::instance(); return 0; }
单例中懒汉和饿汉的本质区别在于以下几点:
1、饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变。懒汉式如果在创建实例对象时不加上同步安全控制则会导致对对象的访问不是线程安全的。
2、从实现方式来讲他们最大的区别就是懒汉式是延时加载,它是在需要的时候才创建对象,而饿汉式在程序启动的时候就会创建,饿汉式无需关注多线程问题、写法简单明了、能用则用。但是它是加载类时创建实例。所以如果是一个工厂模式、缓存了很多实例、那么就得考虑效率问题,因为这个类一加载则把所有实例不管用不用一块创建。