Builder

#include <iostream>
#include <string>
using namespace std;
 
 
class Product {
public:
	void Append(const string& str) {
		m_string.append(str);
	}
	void Output() {
		cout << m_string.c_str() << endl;
	}
private:
	string m_string;
};
 
 
class Builder {
public:
	virtual Product* GetResult() = 0;
protected:
	friend class Director;
	virtual void Build_A() = 0;
	virtual void Build_B() = 0;
	virtual void Build_C() = 0;
};
 
 
class A_Builder : public Builder {
public:
	A_Builder() {
		m_product = new Product;
	}
	~A_Builder() {
		delete m_product;
	}
	virtual Product* GetResult() {
		return m_product;
	}
protected:
	virtual void Build_A() {
		m_product->Append("A");
	}
	virtual void Build_B() {
		m_product->Append("B");
	}
	virtual void Build_C() {
		m_product->Append("C");
	}
private:
	Product *m_product;
};
 
 
class a_Builder : public Builder {
public:
	a_Builder() {
		m_product = new Product;
	}
	~a_Builder() {
		delete m_product;
	}
	virtual Product* GetResult() {
		return m_product;
	}
protected:
	virtual void Build_A() {
		m_product->Append("a");
	}
	virtual void Build_B() {
		m_product->Append("b");
	}
	virtual void Build_C() {
		m_product->Append("c");
	}
private:
	Product *m_product;
};
 
 
class Director {
public:
	void Construct(Builder *builder) {
		builder->Build_A();
		builder->Build_B();
		builder->Build_C();
	}
};
 
 
int main(int argc, char **argv) {
	Director director;
	Builder *builder;
	if (argc == 1) {
		builder = new A_Builder;
	} else {
		builder = new a_Builder;
	}
	director.Construct(builder);
	Product *product = builder->GetResult();
	product->Output();
	delete builder;
	return 0;
}
 



参考サイト

デザインパターンを“喩え話”で分かり易く理解する
http://www.netlaputa.ne.jp/~hijk/study/oo/designpattern.html



デザインパターンの骸骨たち
http://www002.upp.so-net.ne.jp/ys_oota/mdp/

デザインパターンの使い方: Builder
http://japan.internet.com/developer/20081014/26.html
最終更新:2011年11月13日 20:12