#include #include #include #include #include "abstract.h" class Factory : public PProcess { public: Factory() : PProcess() { } void Main(); }; PCREATE_PROCESS(Factory) template class Display { public: static void ConcreteTypes(const char * title) { cout << "\nConcrete types for " << title << ':' << endl; typename PFactory::KeyList_T keys = PFactory::GetKeyList(); typename PFactory::KeyList_T::const_iterator r; for (r = keys.begin(); r != keys.end(); ++r) cout << " " << *r << endl; cout << endl; } static void TestFactory() { typename PFactory::KeyList_T keyList = PFactory::GetKeyList(); unsigned i; for (i = 0; i < keyList.size(); i++) { for (int j = 0; j < 3; j++) { MyAbstractClass * c = PFactory::CreateInstance(keyList[i]); if (c == NULL) cout << "Cannot instantiate class " << keyList[i] << endl; else cout << keyList[i] << "::Function returned \"" << c->Function() << "\", instance " << (void *)c << endl; } } } }; void Factory::Main() { Display::ConcreteTypes("MyAbstractClass by PString"); Display::TestFactory(); Display::ConcreteTypes("MyAbstractClass by unsigned"); Display::TestFactory(); Display::ConcreteTypes("PURLScheme"); Display::ConcreteTypes("PTextToSpeech"); Display::ConcreteTypes("PPluginModuleManager"); }