一、单例模式是什么?
一个类只有一个实例,单例模式的关键是static关键字的使用:static修饰类的成员变量时,在main()函数开始执行前就被初始化;static修饰局部变量时,在被调用的使用才被初始化。两者都是只被初始化一次,一直到程序结束才被释放。
二、什么时候使用?
(1)避免在开发过程中,创建出一个类的多个实例(占用空间,性能问题),所以使用单例模式,保证该类只创建一个对象。
(2)一般单例模式通常有两种形式:它的构造函数为private的,必须有一个静态方法,静态方法返回自己的实例;实现形式有两种:懒汉式和饿汉式;所谓的饿汉式就是在声明实例的时候直接初始化对象,而懒汉式是先声明一个空对象,在静态方法中实例化该对象并返回。
三、实现方式
1、饿汉式(程序开始就开始生成实例,线程安全)
class SingleInstance
{
public:
static SingleInstance& creatinstance()
{
return instance;
}
private:
SingleInstance()
{
std::cout << "正在构造!" << std::endl;
}
~SingleInstance()
{
std::cout << "正在析构!" << std::endl;
}
SingleInstance(const SingleInstance&) = delete;
const SingleInstance& operator=(const SingleInstance&) = delete;
static SingleInstance instance;
};
SingleInstance SingleInstance::instance;
int main()
{
SingleInstance &m_instance = SingleInstance::creatinstance();
SingleInstance &m_instance2 = SingleInstance::creatinstance();
}
2、懒汉式(在需要生成实例的地方再调用对应的函数,线程有可能会抢夺实例化函数)
这里只实现一种方式
class SingleInstance
{
public:
static SingleInstance& creatinstance()
{
static SingleInstance instance;
return instance;
}
private:
SingleInstance()
{
std::cout << "正在构造!" << std::endl;
}
~SingleInstance()
{
std::cout << "正在析构!" << std::endl;
}
SingleInstance(const SingleInstance&) = delete;
const SingleInstance &operator=(const SingleInstance&) = delete;
};
int main()
{
SingleInstance &m_instance = SingleInstance::creatinstance();
SingleInstance &m_instance2 = SingleInstance::creatinstance();
}
输出结果:
正在构造!
正在析构!