简单单例模式的使用
一共有两点:
1. 构造函数必须是private的,如果不是private的,外部对象就可以创建,就可以多个,即不属于单例模式。单例模式要求必须一个。
2. 类必须提供至少一个static的方法,用于对外创建自身的唯一对象。(本身控制,判断指针是否为空,为空创建,不为空则不创建,体现在唯一上。)
简单总结:构造函数private + 方法static + 保唯一
单例模式的好处是唯一,避免内存、连接等资源的浪费,比如配置文件,就一份,可共享。
举例:
int Init()
{
m_pAppCfg = StAppConfig::getInstance();
if (NULL ==
m_pAppCfg)
{
return -1;
}
return 0;
}
class StAppConfig
{
public:
static StAppConfig * getInstance()
{
if (NULL == m_pCfg)
{
//指向自身对象,目的仅创建一次对象,即单例模式。
m_pCfg = new StAppConfig ();
}
//返回指向自身的一个指针,返回创建的单例模式的地址
return m_pCfg;
}
private:
StAppConfig():m_pCfg(NULL){};
StAppConfig * m_pCfg;
}
变量初始化的方式有两种:
int i=0;
int i;
i=0;
StAppConfig tmp1; x错误 。
StAppConfig tmp2; x错误 。
因为创建对象的时候,一定会调用构造函数。 不论是缺省的还是自实现的,一定要调用。
又因为构造函数是私有的,所以不能创建对象(实例),没有实例就不能调用类中的普通方法(非static方法)
加上static后,就变成了全局类方法。可以通过以下两种方法进行使用。
1. 类名+::+ static方法 [必须是static的]
2. 对象.或->static方法 [一般使用方式1]
StAppConfig * tmp1=StAppConfig:: getInstance() ; //对象的指针变量
StAppConfig * tmp2=StAppConfig:: getInstance() ;
这种做法正确。 指针是地址的指向,并没有创建对象。真正的创建对象是getInstance来创建的。
为什么getInstance可以创建?
答:
类成员方法,只能对象来调。
引用是别名的概念,引用必须指向同一种类型,并且只能赋值一次。
指针是同类型之间任意变量指向。