JUCE类库Singleton单例模式

某个类要实现线程安全的Singleton单例模式,可通过预定义的单例宏来实现。步骤有3:

1、类中声明。

// 1参为类名。2参为true则整个程序只允许创建一次单例对象。销毁后无法再创建 
juce_DeclareSingleton (类名, false)   // 末尾无需分号


类中声明此语句后,该类自动拥有以下3个静态函数和1个普通成员函数:
 getInstance() 如果尚未创建本类的对象,则创建。如果已创建,则返回之
 getInstanceWithoutCreating()返回已经创建的本类对象,如果尚未创建,则返回空指针
 deleteInstance() 销毁已创建的本类对象。如果已销毁或尚未创建,则什么也不做
 clearSingletonInstance()普通成员函数。如果已经创建了本类对象,则将其置为空指针

2、析构清理。单例类的类实现,析构函数中添加:

clearSingletonInstance(); // 末尾有分号

3、全局声明。类实现析构函数之后添加一个宏。注意:该宏不属于任何函数,也不属于该类,是全局性的(即:该宏位于cpp源文件的析构函数与另一个成员函数的实现之间):

juce_ImplementSingleton (类名)    // 末尾无分号

单例对象的创建和销毁不采用常规方式,事实上,根本无需显式创建单例对象。需要该类完成某个功能时,直接类名:: getInstance()->成员函数; 即可。当然,也可采用下面的语句获取单例对象:

// 如果尚没有单例,则创建并返回之,如果已经创建,则直接返回
单例类* pointer = 单例类::getInstance();

销毁单例对象,通常在程序主体类的systemRequestedQuit()函数中完成:

// 安全销毁单例
单例类::deleteInstance();

示例代码:

// xml节点对象(常指针)获得赋值
XmlElement* const keys = 单例类::getInstance()->getProps().getXmlValue ("keys");

以上是线程安全的单例类。如果单例类不运行于多线程环境,则可在类的头/源文件中使用速度更快的juce_DeclareSingleton_SingleThreaded和juce_ImplementSingleton_SingleThreaded宏。