diff --git a/src/gui/server/factory.cpp b/src/gui/server/factory.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0edd6db31485997e6464a0e29260336a5325a81d --- /dev/null +++ b/src/gui/server/factory.cpp @@ -0,0 +1,99 @@ + +#include <iostream> +#include <map> +#include <stdexcept> +#include <string> + + +class Request +{ +public: + Request() + { + std::cout << "This is a Normal Request" << std::endl; + } +}; + +class SpecificRequest : public Request +{ +public: + SpecificRequest() + { + std::cout << "This is a Specific Request" << std::endl; + } +}; + + +class RequestCreatorBase +{ +public: + virtual Request *create() = 0; + virtual RequestCreatorBase *clone() = 0; +}; + +template< typename T > +class RequestCreator : public RequestCreatorBase +{ +public: + virtual Request *create() + { + return new T(); + } + + virtual RequestCreatorBase *clone() + { + return new RequestCreator< T >(); + } +}; + + +class RequestFactory +{ +public: + Request *create(const std::string &requestname) + { + std::map< std::string, RequestCreatorBase * >::iterator pos = mRequests.find(requestname); + if(pos == mRequests.end()) { + throw std::runtime_error("there's no request of that name"); + } + + return pos->second->create(); + } + + template< typename T > + void registerRequest(const std::string &requestname) + { + std::map< std::string, RequestCreatorBase * >::iterator pos = + mRequests.find(requestname); + if(pos != mRequests.end()) { + delete pos->second; + mRequests.erase(pos); + } + + mRequests.insert(std::make_pair(requestname, new RequestCreator< T >())); + } + + private: + std::map< std::string, RequestCreatorBase * > mRequests; +}; + + +int main(int, char **) +{ + RequestFactory factory; + + factory.registerRequest< Request > ("requestsimple"); + factory.registerRequest< SpecificRequest >("requestspecific"); + + std::cout << "First one" << std::endl; + delete factory.create("requestsimple"); + + std::cout << "Second one" << std::endl; + delete factory.create("requestspecific"); + + factory.registerRequest< SpecificRequest >("requestsimple"); + std::cout << "Third one" << std::endl; + delete factory.create("requestsimple"); + + return 0; +}