///////////////////////////////////////////////////////////////////////// // Client.cpp - uses concrete factory and product through abstractions // // // // Jim Fawcett, CSE776 - Design Patterns, Summer 2009 // ///////////////////////////////////////////////////////////////////////// /* * Notes: * - If you examine FactoryMethod.h and ConfigureClient.h you will see that * the client has no binding to either concrete product or concrete factory. * - If we need to substitute a different concrete product subclass, we must * rebuild the ConfigureClient module but do not need to rebuild the client. * - The client can use an open-ended number of concrete products since we * provided the Configure::doConfigure(ProductIndex) with a parameter. */ #include "FactoryMethod.h" #include "ConfigureClient.h" #include void main() { std::cout << "\n Demonstrating FactoryMethod Skeleton"; std::cout << "\n ======================================\n"; int ProductIndex = 0; Configure cc; std::cout << "\n configuring client with product index = " << ProductIndex; Creator* pCreator = cc.doConfigure(ProductIndex); if(pCreator) { std::cout << "\n accessing product operation through factory method"; pCreator->DoOperation(); } else std::cout << "\n no definition for creator with index = " << ProductIndex; std::cout << "\n"; delete pCreator; ProductIndex = 1; std::cout << "\n configuring client with product index = " << ProductIndex; pCreator = cc.doConfigure(ProductIndex); if(pCreator) { std::cout << "\n accessing product operation through factory method"; pCreator->DoOperation(); } else std::cout << "\n no definition for creator with index = " << ProductIndex; std::cout << "\n"; delete pCreator; std::cout << "\n client can also access the product through Product interface:"; ProductIndex = 0; pCreator = cc.doConfigure(ProductIndex); Product* pProduct = pCreator->FactoryMethod(); pProduct->ProductOperation(); std::cout << "\n\n"; delete pProduct; delete pCreator; }