close

最後一個是為了確保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消除了

全站熱搜
創作者介紹
創作者 kgsprogrammer 的頭像
kgsprogrammer

太陽系後援會

seeulin 發表在 痞客邦 留言(1) 人氣()