最後一個是為了確保Factory唯一性所做的機制
也就是DesignPatterns裡面的Singleton
相信很多人都有使用過的經驗
但是書中提到的卻是使用過度的Singletonitis(指沈迷於Singleton)
裡面講了很多不需要使用Singleton的情形
它最大的問題就是製造了全域的變數
而且還是一個工廠(Factory)的大小!
並不是說不要使用Singleton
而是使用它之前一定要慎重的思考其必要性
到最後得到一個結論:
『當你可以設計出一種避免使用Singleton的方法時
就不要使用它』
再回到AI的建立
假設今天要建立物理的Shape
而且一隻AI可能需要多個Shape
可能會有這樣的設計:
class ShapeFactory
{
public:
static ShapeFactory * GetInstance()
{
static ShapeFactory *ms_pFactory = NULL;
if (ms_pFactory == NULL)
ms_pFactory = new ShapeFactory();
return ms_pFactory;
};
NxShape *CreateShape(iType, vExtend, kTransform)
{
switch (iType)
{
case NxBoxShape:
return ksPhysX::Get()->CreateBoxShape(vExtend, kTransform);
case NxSphereShape:
return ksPhysX::Get()->CreateSphereShape(
vExtend, kTransform);
case NxCapsultShape:
return ksPhysX::Get()->CreateCapsultShape(
vExtend, kTransform);
}
};
private:
ShapeFactory();
~ShapeFactory();
};
class PhysXKit
{
public:
NxShape *CreateShape(iType, vExtend, kTransform);
{
return ShapeFactory::GetInstance()->CreateShape(
iType, vExtend, kTransform);
}
};
嗯,我需要建立很多不同種類的Shape
所以我建立了一個Shpae Factory來處理這件事情
而且還是一個Singleton的Factory
但是有這個必要嗎?
事實上這個Factory只會被PhysXKit使用
卻被建立為全域的Singleton Instance
理論上它應該被合併到PhysXKit裡面,如下:
class PhysXKit
{
public:
NxShape *CreateShape(iType, vExtend, kTransform)
{
switch (iType)
{
case NxBoxShape:
return ksPhysX::Get()->CreateBoxShape(vExtend, kTransform);
case NxSphereShape:
return ksPhysX::Get()->CreateSphereShape(
vExtend, kTransform);
case NxCapsultShape:
return ksPhysX::Get()->CreateCapsultShape(
vExtend, kTransform);
}
};
};
這就是書上提到的Inline Singleton(Singleton內置化)
如果再看詳細一點,會發現ksPhysX似乎也有同樣的問題
如此一直改下去,就能夠把不該存在的Singleton消除了
- Aug 16 Sat 2008 20:59
Refactoring to Patterns~Creation~Singleton
close
全站熱搜
留言列表
發表留言