変形AbstractFactory

class IHogeFactory{
public:
    virtual ~IHogeFactory(){}
    virtual IHoge* create( int n ) = 0;
    virtual int getType() = 0;
};

class IHoge{
public:
    static IHoge* create( int n ){
        if( _factory == null ) return null;
        return _factory->create( n );
    }
    
    static void setFactory( smart_ptr< IHogeFactory > f ){
        _factory = f;
    }
    
    static smart_ptr< IHogeFactory > getFactory(){
        return _factory;
    }
private:
    static smart_ptr< IHogeFactory > _factory;
};
class CHogeFactory : public IHogeFactory{
public:
    static void use(){
        if(
            IHoge::getFactory() == null ||
            IHoge::getFactory()->getType() != getType()
        ){
            IHoge::setFactory(
                smart_ptr< IHogeFactory >( new CHogeFactory )
            );
        }
    }

    static IHoge* createInstance( int n ){
        use();
        return IHoge::create( n );
    }
    
    IHoge* create( int n ){
        switch( n ){
        case 0:       return new CHoge;
        case 1:       return new CHogeHoge;
        }
    }
    
    int getType(){
        return 0;
    }
};

staticなFactoryをどこでセットすればいいのか悩んだ末、Factoryに手動RTTIを付けて、createするときに自動的にセットするようにしてみました。




……よく考えてみるとIHogeからcreateする必要ないじゃんかYO!!
CHogeFactoryのcreateInstance()からそのままnewして返せばいいじゃん(;´Д`)



……と思ったけど、やっぱりIHogeかIHogeFactoryのどちらかに用意しておかないと、セットされているFactoryを調べるとか、そういうことが出来なくなるので必要か(;´Д`)