// Purpose. Abstract Factory design pattern lab. // // Problem. #ifdef case statements are spread throughout the code to // accomodate 3 different porting targets. This makes maintenance // difficult, and porting to a 4th platform onerous. // // Assignment. // o Create an abstract base class Factory. // o Define pure virtual member functions createSocket(), createPipe(), // and createThread(). // o Subclass UnixFactory, VmsFactory, and NtFactory off of Factory. // o Refactor the "create" free functions to be member functions of one of // the Factory derived classes. // o Declare a Factory* pointer local to main(). // o Use a single #ifdef case statement in main() to instantiate the desired // Factory derived class. // o Do not optimize-out the doOneLaneIPC(), doTwoLaneIPC(), and // doParallelProcessing() free functions. // o Pass the Factory pointer to each of these free functions so that they // can create sockets, pipes, and threads without regard to race, creed, // or platform. // o Supply the desired "compiler directive" at compile time. // o Extra credit: implement the Factory class as a Singleton. #include void createUnixSocket() { cout << "createUnixSocket:" << endl; } void createVmsSocket() { cout << "createVmsSocket:" << endl; } void createNtSocket() { cout << "createNtSocket:" << endl; } void createUnixPipe() { cout << "createUnixPipe:" << endl; } void createVmsPipe() { cout << "createVmsPipe:" << endl; } void createNtPipe() { cout << "createNtPipe:" << endl; } void createUnixThread() { cout << "createUnixThread:" << endl; } void createVmsThread() { cout << "createVmsThread:" << endl; } void createNtThread() { cout << "createNtThread:" << endl; } void doOneLaneIPC() { #ifdef UNIX createUnixSocket(); #elif VMS createVmsSocket(); #elif NT createNtSocket(); #endif } void doTwoLaneIPC() { #ifdef UNIX createUnixPipe(); #elif VMS createVmsPipe(); #elif NT createNtPipe(); #endif } void doParallelProcessing() { #ifdef UNIX createUnixThread(); #elif VMS createVmsThread(); #elif NT createNtThread(); #endif } void main( void ) { doOneLaneIPC(); doTwoLaneIPC(); doParallelProcessing(); cout << "main: complete" << endl; } // -- current output -- // createVmsSocket: // createVmsPipe: // createVmsThread: // main: complete // -- target output -- // VmsFactory: createSocket // VmsFactory: createPipe // VmsFactory: createThread // main: complete