Builder パターン

Builder パターン - Wikipedia

構造をもったオブジェクトを作成するパターン。構造を作り上げる過程の詳細は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;
}