変形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を調べるとか、そういうことが出来なくなるので必要か(;´Д`)