今天我来写一写我们项目中所用的技术,单例模式。很巧的是,单例模式并非我们的项目实施的每一个省都在用,所以,你在代码中无法看到,很正常。
方法因需求而生。就像我们工作的事一样,我们需要一个打印机,公司若有,便让我们用,若没有,则买一个给我们用,总之,打印机最多有一个。所以一开始,我们定义了Printer类,悲剧的是,Printer* pa = new Printer()、Printer* pb = new Printer()、Printer* pc = new Printer()就可以随意购买打印机,现状就是:每个人都可以买打印机,问题由此展开。
我们想到的就是,把“构造函数”置为私有,然后先定义一个打印机指针。代码如下:/*
* RemindApi.h
*
* Created on: Mar 15, 2014
* Author: huasheng
*/
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include <cstddef>
#include<iostream>
using namespace std;
class RemindApi
{
private:
static RemindApi* instance;
RemindApi();
public:
static RemindApi* getInstance();
bool read();
bool write();
};
instance就是一个惟一打印机的代号,构造函数也置为private了,似乎还缺少一个判断打印机是否存在,不存则购买的动作,因此,下面代码由此而生。
/*
* RemindApi.cpp
*
* Created on: Mar 15, 2014
* Author: huasheng
*/
#include"RemindApi.h"
RemindApi* RemindApi::instance = (RemindApi*)NULL;
RemindApi::RemindApi()
{
}
RemindApi* RemindApi::getInstance()
{
if(NULL == instance)
{
instance = new RemindApi();
}
return instance;
//return NULL;
}
bool RemindApi::read()
{
cout<<"I am reading"<<endl;
return true;
}
bool RemindApi::write()
{
cout<<"I am writing"<<endl;
return true;
}
代码的精髓便是getInstance()函数了,有人会问,怎么使用呢?
/*
* main.cpp
*
* Created on: Mar 15, 2014
* Author: huasheng
*/
#include"RemindApi.h"
int main()
{
RemindApi* rpi = RemindApi::getInstance();
RemindApi* rpi1 = RemindApi::getInstance();
rpi->write();
rpi->read();
return 0;
}
上面代码,很明显,rpi和rpi1肯定是一样的,无所何时,你去寻找一个指针,得到的都是一样的。
最后,我还要说,RemindApi* RemindApi::instance = (RemindApi*)NULL;是不是重复定义,经过实践我才得知道,类的静态变量不仅要在类中声明,还要在类外进行声明+初始化。