最後一個是為了確保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
            
        
            全站熱搜
         留言列表
 留言列表
發表留言
       
         留言列表
 留言列表 
             
 
 程式研究 (8)
 程式研究 (8)


