设计模式

设计模式代表了最佳实践,是软件开发过程中面临一般问题的解决方案

设计模式是一套被反复使用,经过分类,代码设计的经验

单例模式

单例模式也叫单件模式Singleton是一个非常用的设计模式,建一个线程安全且高效的Singleton是非常重要的

1.不考虑线程安全的一个单例模式

class Singleton
{
public:
	static Singleton* GetInstance()
	{
		if (_sInstance == NULL)
		{
			_sInstance = new Singleton();
		}
		return _sInstance;
	}
	static void DelInstance()
	{
		if (_sInstance)
		{
			delete _sInstance;
			_sInstance = NULL;
		}
	}
	void Print()
	{
		cout << _data << endl;
	}
private:
	//定义构造函数私有,限制只能在类内创建对象
	Singleton()
		:_data(0)
	{}
	Singleton(const Singleton&);
	Singleton& operator=(const Singleton&);
	//指向实例的指针为静态私有,这样定义静态成员函数获取对象实例
	static Singleton* _sInstance;
	int _data;
};

2.线程安全单例

懒汉模式

class Singleton
{
public:
	static Singleton* GetInstance()
	{
        if(_sInstance==NULL)
        {
          lock();
		   if (_sInstance == NULL)
		   {
			_sInstance = new Singleton();
		   }
          unlock();
		   return _sInstance;
	}
	static void DelInstance()
	{
		if (_sInstance)
		{
			delete _sInstance;
			_sInstance = NULL;
		}
	}
	void Print()
	{
		cout << _data << endl;
	}
private:
	//定义构造函数私有,限制只能在类内创建对象
	Singleton()
		:_data(0)
	{}
	Singleton(const Singleton&);
	Singleton& operator=(const Singleton&);
	//指向实例的指针为静态私有,这样定义静态成员函数获取对象实例
	static Singleton* _sInstance;
	int _data;
};
//静态的数据成员必须初始化
Singleton* Singleton::_sInstance = NULL;
void TestSingleton()
{
	Singleton::GetInstance()->Print();
	Singleton::DelInstance();
}

第二个版本

class Singleton
{
public:
	static Singleton* GetInstance()
	{
                 
        
		if (_sInstance == NULL)
		{
			_sInstance = new Singleton();
		}
		return _sInstance;
	}
	static void DelInstance()
	{
	        std::lock_guard lock(_mtx);
		if (_sInstance)
		{
			delete _sInstance;
			_sInstance = NULL;
		}
	}
	void Print()
	{
		cout << _data << endl;
	}
private:
	//定义构造函数私有,限制只能在类内创建对象
	Singleton()
		:_data(0)
	{}
	Singleton(const Singleton&);
	Singleton& operator=(const Singleton&);
	//指向实例的指针为静态私有,这样定义静态成员函数获取对象实例
	static Singleton* _sInstance;
	int _data;
};
//静态的数据成员必须初始化
Singleton* Singleton::_sInstance = NULL;
void TestSingleton()
{
	Singleton::GetInstance()->Print();
	Singleton::DelInstance();
}

饿汉模式

方式一

class Singleton
{
public:
// 获取唯一对象实例的接口函数
      static Singleton* GetInstance()
     {
               static Singleton tmp;
               return &tmp;
    }
void Print()
{
          cout<<_data<Print();
}

方式二

class Singleton
{
public:
// 获取唯一对象实例的接口函数
      static Singleton* GetInstance()
    {
        assert(_sInstance);
        return _sInstance;
     }
// 删除实例对象
static void DelInstance()
{
if (_sInstance)
 {
       delete _sInstance;
     _sInstance = NULL;
}
}
void Print()
{
      cout << _data << endl;
}
private:
// 构造函数定义为私有,限制只能在类内创建对象
Singleton()
   :_data(0)
   {}
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
// 指向实例的指针定义为静态私有,这样定义静态成员函数获取对象实例
static Singleton* _sInstance;
// 单例类里面的数据
int _data;
};
Singleton* Singleton::_sInstance = new Singleton;
void TestSingleton()
{
   Singleton::GetInstance()->Print();
    Singleton::DelInstance();
}

在堆上创建对象

class AA
{
public:
	AA* GetObj()
	{
		return new AA;
	}
private:
	AA()
	{}
	AA(const AA&);
	int a;
};

在栈上创建对象

方式一

class AA
{
public:
	AA GetObj()
	{
		return  AA();
	}
private:
	AA()
	{}
	AA(const AA&);
	int a;
};

方式二

class AA
{
private:
	void*operator new(size_t);
	void operator delete(void*p);
	void*operator new[](size_t);
	void operator delete[](void* p);
private:
	AA()
	{}
	AA(const AA&);
	int a;
};