Builder パターン
構造をもったオブジェクトを作成するパターン。構造を作り上げる過程の詳細はDirectorが隠ぺい。またDirectorは建築会社(Builder)にオブジェクト(今回はテキスト)の作成を依頼するものの、どこの会社(Text or HTMLBuilder)なのかはわからないままに発注しているようなイメージ。
#include<iostream> #include<string> using namespace std; //Builder class Builder{ public : virtual void MakeTitle(string str) = 0; virtual void MakeString(string str) = 0; virtual void Close() = 0; virtual string GetResult() = 0; }; //Concrete Builder 1; class TextBuilder : public Builder{ public : void MakeTitle(string str){ text_ = "=====================================\n"; text_ += "『" + str +"』\n"; } void MakeString(string str){ text_ += str + "\n"; } void Close(){ text_ += "=====================================\n"; } string GetResult(){ return this->text_; } private : string text_; }; //Concrete Builder 2; class HTMLBuilder : public Builder{ public : void MakeTitle(string str){ text_ = "<html><head><title>" + str +"</title></head><body>\n"; } void MakeString(string str){ text_ += "<p>" + str + "</p>\n"; } void Close(){ text_ += "</body></html>"; } string GetResult(){ return this->text_; } private : string text_; }; //Director class Director{ public : Director(Builder *builder){ this->builder_ = builder; } ~Director(){ delete builder_; } string Construct(){ builder_->MakeTitle("Greeting"); builder_->MakeString("あいうえお"); builder_->MakeString("かきくけこ"); builder_->Close(); return builder_->GetResult(); } private : Builder *builder_; }; //main int main() { Director *d1 = new Director(new TextBuilder); Director *d2 = new Director(new HTMLBuilder); cout << d1->Construct(); cout << d2->Construct(); delete d1; delete d2; return 0; }