1、单例模式介绍
单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)。当然了,我们可以理解为,单例模式就是蝎子的尾巴,独一份。具体怎么独一份呢,就是说程序运行起来之后,单例的对象就只有一个,外部获取到的也是唯一的一个。
单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。
2、代码示例
接下来,我们就采用c++的模板设计一个单例模式的模板,此后再需要使用单例模式的地方,就直接继承这个模板,并且初始化TYPE就可以直接使用单例模式了,万一工程中有其他地方需要使用到单例模式,以此类推,直接继承并实现就可以,也不需要重复的造轮子。
#include <iostream>
#include <thread> // std::thread
#include <mutex> // std::mutex, std::lock_guard
std::mutex mtx;
using namespace std;
template <typename TYPE>
class Singleton
{
public:
static TYPE& getInstance() {
TYPE* instance = mInstance;
std::lock_guard<std::mutex> lck (mtx);
if (instance == 0) {
instance = new TYPE();
mInstance = instance;
}
return *mInstance;
}
static bool hasInstance() {
std::lock_guard<std::mutex> lck (mtx);
return mInstance != 0;
}
protected:
~Singleton() { }
Singleton() { }
private:
Singleton(const Singleton&);
Singleton& operator = (const Singleton&);
static TYPE* mInstance;
};
template <typename TYPE>
TYPE* Singleton<TYPE>::mInstance = NULL;
/
上面是单例模式模板类的源码,下面我们来应用下这个模板,具体代码如下所示:
#include <iostream>
#include <thread> // std::thread
#include <mutex> // std::mutex, std::lock_guard
using namespace std;
std::mutex mtx;
/************************************************************************
* 文件说明
* 单例模式示例
*************************************************************************/
template <typename TYPE>
class Singleton
{
public:
static TYPE& getInstance() {
TYPE* instance = mInstance;
std::lock_guard<std::mutex> lck (mtx);
if (instance == 0) {
instance = new TYPE();
mInstance = instance;
}
return *mInstance;
}
static bool hasInstance() {
std::lock_guard<std::mutex> lck (mtx);
return mInstance != 0;
}
protected:
~Singleton() { }
Singleton() { }
private:
Singleton(const Singleton&);
Singleton& operator = (const Singleton&);
static TYPE* mInstance;
};
template <typename TYPE>
TYPE* Singleton<TYPE>::mInstance = NULL;
/
// Test
class Test : public Singleton <Test>
{
public:
Test() { mCreateNum++;};
void printCreateNum(void) { std::cout << "CreatMum:" << mCreateNum << endl; }
private:
int mCreateNum = 0;
};
int main(int agc,char *argv[])
{
class Test *test1 = &Test::getInstance();
class Test *test2 = &Test::getInstance();
test1->printCreateNum();
test2->printCreateNum();
std::cout << "Test = "<< test1 << std::endl;
std::cout << "Test = "<< test2 << std::endl;
return 0;
}
///
//Out
//CreatMum:1
//CreatMum:1
//Test = 0x665c20
//Test = 0x665c20
从上面的打印,我们可以看到,test1和test2都是指向的同一个对象,所以使用单例模式成功。
3、总结
单例模式是设计模式中最简单的一个模式,使用单例模式的模板,以后可以直接继承,避免重复造轮子。