#define _CRT_SECURE_NO_WARNINGS 1 #include using namespace std; enum PersistenceType { File, Queue, Pathway }; struct PersistenceAttribute { PersistenceType type; char value[30]; }; class DistrWorkPackage { public: DistrWorkPackage(char* type); void setFile(char* f, char* v) { sprintf(_temp, "\n File(%s): %s", f, v); strcat(_desc, _temp); } void setQueue(char* q, char* v) { sprintf(_temp, "\n Queue(%s): %s", q, v); strcat(_desc, _temp); } void setPathway(char* p, char* v) { sprintf(_temp, "\n Pathway(%s): %s", p, v); strcat(_desc, _temp); } const char* getState() { return _desc; } private: char _desc[200], _temp[80]; }; DistrWorkPackage::DistrWorkPackage(char* type) { sprintf(_desc, "Distributed Work Package for: %s", type); } class Builder { public: virtual void configureFile(char*) = 0; virtual void configureQueue(char*) = 0; virtual void configurePathway(char*) = 0; DistrWorkPackage* getResult() { return _result; } protected: DistrWorkPackage* _result; }; class UnixBuilder : public Builder { public: UnixBuilder() { char buf[30] = "Unix"; _result = new DistrWorkPackage(buf); } void configureFile(char* name) { char buf[30] = "flatFile"; _result->setFile(buf, name); } void configureQueue(char* queue) { char buf[30] = "FIFO"; _result->setQueue(buf, queue); } void configurePathway(char* type) { char buf[30] = "thread"; _result->setPathway(buf, type); } }; class VmsBuilder : public Builder { public: VmsBuilder() { char buf[30] = "Vms"; _result = new DistrWorkPackage(buf); } void configureFile(char* name) { char buf[30] = "ISAM"; _result->setFile(buf, name); } void configureQueue(char* queue) { char buf[30] = "priority"; _result->setQueue(buf, queue); } void configurePathway(char* type) { char buf[30] = "LWP"; _result->setPathway(buf, type); } }; class Reader { public: void setBuilder(Builder* b) { _builder = b; } void construct(PersistenceAttribute[], int); private: Builder* _builder; }; void Reader::construct(PersistenceAttribute list[], int num) { for (int i = 0; i < num; i++) if (list[i].type == File) _builder->configureFile(list[i].value); else if (list[i].type == Queue) _builder->configureQueue(list[i].value); else if (list[i].type == Pathway) _builder->configurePathway(list[i].value); } const int NUM_ENTRIES = 6; PersistenceAttribute input[NUM_ENTRIES] = { { File, "state.dat" } , { File, "config.sys" } , { Queue, "compute" } , { Queue, "log" } , { Pathway, "authentication" } , { Pathway, "error processing" } }; int main() { UnixBuilder unixBuilder; VmsBuilder vmsBuilder; Reader reader; reader.setBuilder(&unixBuilder); reader.construct(input, NUM_ENTRIES); cout << unixBuilder.getResult()->getState() << endl; reader.setBuilder(&vmsBuilder); reader.construct(input, NUM_ENTRIES); cout << vmsBuilder.getResult()->getState() << endl; } //nguon https://sourcemaking.com/design_patterns/builder/cpp/1