#include<iostream>
using namespace std;

/*单例模式:

* 1.恶汉式单例模式:还没有获取实例对象,实例对象就已经产生了.

* 2.懒汉式单例模式:唯一的实力对象,直到第一次获取他的时候,才产生.

*/

//一.懒汉式单例模式,优点是节省内存,缺点是线程不安全

class SingleExample
{
public:
	static  SingleExample* getinstance()//#3获取类的唯一实例对象的接口方法.
{
if (instance == nullptr)//如果实例为空,就创建第一个实例,否则返回原来的实例.
  {
  	instance = new SingleExample();
  	return instance;
  }
  return instance;
	}
private:
	SingleExample() {}//#1构造函数私有化.
	static SingleExample* instance;//#2定义一个唯一的类的实例对象的指针.
	SingleExample(const SingleExample&) = delete;//禁用拷贝构造
	SingleExample& operator=(const SingleExample&) = delete;//禁用赋值重载
};
SingleExample* SingleExample::instance=nullptr;//静态成员变量.
int main()
{
	SingleExample* p1 = SingleExample::getinstance();
	SingleExample* p2 = SingleExample::getinstance();
	SingleExample* p3 = SingleExample::getinstance();
	cout << p1 << " " << p2 << " " << p3 << endl;
	//SingleExample t1 = *p1;//(调用拷贝构造,所以要在代码中添加禁止拷贝函数)
	// SingleExample t2;
	return 0;
}

//二.饿汉式单例,线程是安全的.

#if 0
class SingleExample
{
public:
	static SingleExample* getinstance()//#3获取类的唯一实例对象的接口方法.
	{
  return &instance;
	}
private:
	SingleExample(){}//#1构造函数私有化.
	static SingleExample instance;//#2定义一个唯一的类的实例对象.
	SingleExample(const SingleExample&) = delete;//禁用拷贝构造
	SingleExample& operator=(const SingleExample&) = delete;//禁用赋值重载
};
SingleExample SingleExample:: instance;//静态成员变量.
 int main()
 {
  SingleExample* p1 = SingleExample::getinstance();
  SingleExample* p2 = SingleExample::getinstance();
  SingleExample* p3 = SingleExample::getinstance();
  cout << p1 << " " << p2 << " " << p3 << endl;
  SingleExample t1 = *p1;//(调用拷贝构造,所以要在代码中添加禁止拷贝函数)
	// SingleExample t2;
  return 0;
 }
 #endif