特殊的单例模式(Singleton)实现

(本站文章均出自原创,转载请注明出处~) 

 

有时候程序中有多个System对象,比如3D引擎中有RenderSystem, InputSystem, ResoureSystem。 所有这些对象都比较庞大,负责的工作也非常多,并且我们希望这些System在程序中只存在一个实例。为此我们很容易想到用单例模式来实现它。但有时候我们希望程序中存在一个入口,访问程序中的System都必须通过该入口来访问。这里有一种新的思想来实现System的单例化。

在OGRE中所有的System都有一个入口来管理:Root。该对象可以负责所有System的创建:
class Root
{
public:
static RenderSystem& GetRenderSystem();
static InputSystem& GetInputSystem();
static ResourceSystem& Get ResourceSystem();
… …
};
那么负责这些System的单例性就可以由Root对象来负责,如:
RenderSystem& Root:: GetRenderSystem()
{
static RenderSystem sInstance;
return sInstance;
}
InputSystem & Root:: GetInputSystem ()
{
static InputSystem sInstance;
return sInstance;
}
… …
我们知道在函数内部创建的局部静态变量生命周期也是在整个程序运行期间的,而且该对象只会被构造一次。
那么怎么避免直接创建这些System呢?只需要将这些System的构造函数设为protected。然后在这些System里将class Root设为friend就行了:
class RenderSystem
{
friend class Root;
protected:
RenderSystem();
};
这样外部是无法直接创建System的,只有Root可以创建这些System,因为一个类可以访问友元类的protected函数。使用时直接用Root来得到System就可以:
RenderSystem& renderSys = Root::GetRenderSystem();
注意返回值必须是引用或者指针类型。如果不这么做的化想这样:
RenderSystem renderSys = Root::GetRenderSystem();这是先构造一个RenderSystem对象,然后调用其赋值操作符。这样就违背了只能有Root来构造System的原则,编译也是通不过的。

posted @ 2009-04-07 19:54  Jee  阅读(179)  评论(0编辑  收藏  举报