I managed to come up with a more elegant solution (there is currently no error checking). Please let me know your thoughts.
#include<iostream> #include<map> class AbstractFactory { private: typedef std::map< std::string, AbstractFactory* > ClientMap; static ClientMap s_clientMap; public: void virtual createScrollbar() = 0; void virtual createWindow() = 0; static AbstractFactory* createInstance( std::string client ); protected: void Register( std::string, AbstractFactory* ); }; AbstractFactory::ClientMap AbstractFactory::s_clientMap; class LinuxFactory: public AbstractFactory { public: void createScrollbar() { std::cout<<"Scrollbar for Linux"<<std::endl; } void createWindow() { std::cout<<"WIndow for Linux"<<std::endl; } private: LinuxFactory() { Register( "Linux", this ); } LinuxFactory( const LinuxFactory& ); static LinuxFactory s_LinuxFactory; }; LinuxFactory LinuxFactory::s_LinuxFactory; class MacFactory: public AbstractFactory { public: void createScrollbar() { std::cout<<"Scrollbar for Mac"<<std::endl; } void createWindow() { std::cout<<"WIndow for Mac"<<std::endl; } private: MacFactory() { Register( "Mac", this ); } MacFactory( const MacFactory& ); static MacFactory s_MacFactory; }; MacFactory MacFactory::s_MacFactory; void AbstractFactory::Register( std::string clientName, AbstractFactory* factory ) { s_clientMap.insert( ClientMap::value_type( clientName, factory ) ); } AbstractFactory* AbstractFactory::createInstance( std::string client ) { return s_clientMap.find( client )->second; } int main() { AbstractFactory *factory = AbstractFactory::createInstance( "Linux" ); factory->createScrollbar(); factory->createWindow(); }
source share