#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;
}
参考サイト
最終更新:2011年11月13日 20:12