1-1、singleton.h
#ifndef SINGLETON_H
#define SINGLETON_H
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton* Instance(); //创建实例函数,作为public
void Print();
protected:
Singleton(); //构构函数,防止产生实例,作为protected
Singleton(const Singleton&){}; //构构函数,防止拷贝构造另一个实例,作为protected
~Singleton();//析构函数,作为protected
private:
static Singleton* mInstance; //类的唯一实例
//TODO:这里可以添加互斥锁成员变量
};
#endif // SINGLETON_H
1-2、singleton.cpp
#include "singleton.h"
Singleton * Singleton::mInstance = NULL;
Singleton::Singleton()
{
cout << "construct Singleton" << endl;
}
Singleton::~Singleton()
{
if (mInstance)
{
delete mInstance;
mInstance = NULL;
}
}
Singleton * Singleton::Instance()
{
//TODO:锁前和锁后检测,保证效率和多线程正确性
if (!mInstance)
{
//TODO: 加锁
if (!mInstance)
{
mInstance = new Singleton;
}
}
return mInstance;
}
void Singleton::Print()
{
cout << "this is a singleton instance" << endl;
}
2、main.cpp
/*
作者:jhluroom弹 QQ:454676244 MSN:jhlu0815@hotmail.com
开发IDE:qt creater
开发环境:QT C++
参考网站:神秘果:http://www.shenmiguo.com/
定义:
单件(Singleton)模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。
理解:
1.Singleton模式用来取代全局静态变量。C++通过静态成员变量来实现类实例全局唯一性。
2.instance()方法是单件提供的唯一调用入口。
要点:
1.为了防止外界调用产生多个实例,将构造方法、析构方法、拷贝构造方法、赋值重载方法都作为protected。
2.instance()方法产生对象方式有两种:使用局部static对象,生命期在首次进入局部生命期产生,在程序结束时销毁;
通过new产生新对象,在析构方法中delete对象。
3.获取单件实例调用方式:Singleton::instance()获取对象指针。
4.解决多线程资源竞争条件。使用著名的“双检测锁定”办法来解决,即在锁定前和锁定后都检测对象是否产生,
这样既能保证加锁效率又能保证单件实例的唯一性。
源码中通过Singleton加以实现。
以上文字说明,从网上整理而来,有可能部分与其他同仁相同,请谅解,希望我们能够共同交流,谢谢!
*/
#include <QtCore/QCoreApplication>
#include "singleton.h"
int main(int argc, char *argv[])
{
cout << "=== jhluroom start ========" << endl;
Singleton *mySingleton = Singleton::Instance();
mySingleton->Print();
cout << "=== jhluroom finish _^_ ===" << endl;
return 0;
}
运行结果:
=== jhluroom start ========
construct Singleton
this is a singleton instance
=== jhluroom finish _^_ ===