单例模式
单例模式就是让一个类智能创建一个对象。单例模式分为两种:懒汉式和饿汉式。但是懒汉式存在着线程安全的问题。需要对线程进行加锁操作。
条件:
- 构造,拷贝和析构函数都是private,所以,无法通过声明对象来构造
- 需要用静态成员变量来控制对象的个数,以保证不重复定义
- 需要有静态的“构造”函数和“析构”函数
#include <iostream>
using namespace std;
//懒汉式
class Lazy{
public:
void setVal(int a, int b){
this->a = a;
this->b = b;
}
void print(){
cout<<"a:b"<<endl;
cout<<a<<":"<<b<<endl;
}
static Lazy *getIstance(){
if(lazy==NULL)
lazy = new Lazy();
return lazy;
}
private:
int a;
int b;
static Lazy *lazy;
Lazy(){
a = 0;
b = 0;
}
class Recover{
public:
~Recover(){
if(Lazy::lazy!=NULL){
delete Lazy::lazy;
Lazy::lazy = NULL;
}
}
};
};
//饿汉式
class Hunger
{
public:
void setVal(int a, int b)
{
this->a = a;
this->b = b;
}
void print(){
cout<<"a:b"<<endl;
cout<<a<<":"<<b<<endl;
}
static Hunger *getInstance()
{
Recovery *recover;
return hunger;
}
private:
int a;
int b;
Hunger(){
a = 0;
b = 0;
}
static Hunger *hunger;
class Recovery{
public:
~Recovery(){
if(Hunger::hunger != NULL){
delete hunger;
hunger = NULL;
}
}
};
};
Hunger *Hunger::hunger = new Hunger();
Lazy *Lazy::lazy = NULL;
int main()
{
Hunger *hunger1 = Hunger::getInstance();
hunger1->setVal(300, 400);
hunger1->print();
Hunger *hunger2 = Hunger::getInstance();
hunger2->print();
cout<<hunger1<<":"<<hunger2<<endl;
Lazy *lazy1 = Lazy::getIstance();
lazy1->setVal(100, 200);
lazy1->print();
Lazy *lazy2 = Lazy::getIstance();
lazy2->print();
cout<<lazy1<<":"<<lazy2<<endl;
return 0;
}