1.什么是单例模式
单例模式就是一个类就只能创建一个对象
2.单例模式实现方法
一般情况下,构造函数都都在public下,默认的也在public下,这种情况下我们可以使用这个类创建任意多个对象;
1)如果我们把构造函数写在private下,那我们就不能用这个类创建对象
#include <iostream>
using namespace std;
class Cperson
{
private:
Cperson()
{
cout << "Cperson" << endl;
}
};
int main()
{
Cperson per;
system("pause");
return 0;
}
编译报错:
如果不改变构造函数在private下,那我们应该如何操作来创建对象呢?做法就是:
2)通过静态成员函数来申请空间,并返回地址
#include <iostream>
using namespace std;
class Cperson
{
private:
Cperson()
{
cout << "Cperson" << endl;
}
public:
static Cperson *creat()
{
return (new Cperson);
}
};
int main()
{
Cperson *per = Cperson::creat();
system("pause");
return 0;
}
执行结果:
为什么要写成静态函数成员呢?因为静态函数成员可以通过类的作用域来访问,同时因为此时不能创建对象,自然不能通过对象来访问函数成员,所以只能写成静态函数成员了,在静态函数返回一个地址时,new了一个新空间,所以执行了构造函数
这种方式虽然能创建了对象了,但是还是不能只创建一个对象,这种还是可以创建多个对象
3)定义一个静态标记,记录对象的个数,并控制
#include <iostream>
using namespace std;
class Cperson
{
private:
Cperson()
{
cout << "Cperson" << endl;
}
public:
static bool Flag;
static Cperson *creat()
{
if (Flag)
{
Flag = false;
return (new Cperson);
}
else
return NULL;
}
};
bool Cperson::Flag = true;
int main()
{
Cperson *per = Cperson::creat();
delete per;
Cperson *per1 = Cperson::creat();
system("pause");
return 0;
}
编译成功,但还是存在一个问题,这个问题就是,在创建一个对象后,就算我们delete了当前对象,但是我们还是不能创建新的对象
4)在析构函数中将标记清空,达到重新创建对象的目的
#include <iostream>
using namespace std;
class Cperson
{
private:
Cperson()
{
cout << "Cperson" << endl;
}
public:
static bool Flag;
static Cperson *creat()
{
if (Flag)
{
Flag = false;
return (new Cperson);
}
else
return NULL;
}
~Cperson()
{
Flag = true;
}
};
bool Cperson::Flag = true;
int main()
{
Cperson *per = Cperson::creat();
delete per;
Cperson *per1 = Cperson::creat();
delete per1;
system("pause");
return 0;
}
执行结果:
3.注意
1)如果有其他构造函数构成重载,这些构造函数也要写在private下面,同时,赋值函数(运算符=的重载)、拷贝构造也要写在private下面
2)单例模式不唯一
3)构造函数等等写在protected下面也是单例
4)构造函数是私有的时,继承后,这个子类不能被实例化