// 所有原创文章转载请注明作者及链接
// blackboycpp(AT)gmail.com
// QQ群: 135202158
类图:
代码实现:
头声明:
#ifndef __BUILDER_H__
#define __BUILDER_H__
namespace blackboycpp
{
class ProductA;
class ProductB;
class Builder;
//////////////////////////////////////////////////////////////////////////
// Director
class Director
{
public:
void Construct(Builder* builder);
};
//////////////////////////////////////////////////////////////////////////
// Builders
class Builder
{
public:
// 注意,以下2函数不能声明为纯虚函数,这样派生类可以不必非得实现
virtual void BuildPartA();
virtual void BuildPartB();
};
class ConcreteBuilderA : public Builder
{
public:
ConcreteBuilderA();
public:
virtual void BuildPartA();
virtual void BuildPartB();
virtual ProductA* GetProductA() { return _productA; }
private:
ProductA* _productA;
};
class ConcreteBuilderB : public Builder
{
public:
ConcreteBuilderB();
public:
virtual void BuildPartA();
virtual ProductB* GetProductB() { return _productB; }
private:
ProductB* _productB;
};
//////////////////////////////////////////////////////////////////////////
// Products
class ProductA
{
};
class ProductB
{
};
}
#endif
类实现:
namespace blackboycpp
{
void Director::Construct(Builder* builder)
{
std::cout << "Director::Construct(Builder*)/n";
builder->BuildPartA();
builder->BuildPartB();
}
void Builder::BuildPartA()
{
std::cout << "Builder::BuildPartA()/n";
}
void Builder::BuildPartB()
{
std::cout << "Builder::BuildPartB()/n";
}
ConcreteBuilderA::ConcreteBuilderA()
{
std::cout << "ConcreteBuilderA::ConcreteBuilderA()/n";
_productA = new ProductA;
}
void ConcreteBuilderA::BuildPartA()
{
std::cout << "ConcreteBuilderA::BuildPartA()/n";
}
void ConcreteBuilderA::BuildPartB()
{
std::cout << "ConcreteBuilderA::BuildPartB()/n";
}
ConcreteBuilderB::ConcreteBuilderB()
{
std::cout << "ConcreteBuilderB::ConcreteBuilderB()/n";
_productB = new ProductB;
}
void ConcreteBuilderB::BuildPartA()
{
std::cout << "ConcreteBuilderB::BuildPartA()/n";
}
}
main():
int main(int argc, char** argv)
{
Director* director = new Director;
ConcreteBuilderA* builderA = new ConcreteBuilderA;
director->Construct(builderA);
ProductA* productA = builderA->GetProductA();
delete productA;
delete builderA;
delete director;
system("pause");
return 0;
}