适用情境:创建复杂对象,使用单独类指导对象的创建.
// product.h
#ifndef PRODUCT_H
#define PRODUCT_H
class Product
{
public:
Product();
virtual void Show();
public:
int m_iNumA;
int m_iNumB;
};
#endif // PRODUCT_H
// product.cpp
#include "product.h"
#include <iostream>
Product::Product()
{}
void Product::Show()
{
std::cout << "product show..."<< m_iNumA << " "<< m_iNumB << std::endl;
}
// build.h
#ifndef BUILDER_H
#define BUILDER_H
#include "product.h"
class Builder
{
public:
Builder();
virtual void BuilderMethodA() = 0;
virtual void BuilderMethodB() = 0;
virtual Product * GetProduct() = 0;
};
#endif // BUILDER_H
// builder.cpp
#include "builder.h"
Builder::Builder()
{}
// concretebuilder.h
#ifndef CONCRETEBUILDER_H
#define CONCRETEBUILDER_H
#include "builder.h"
#include "product.h"
class ConcreteBuilder : public Builder
{
public:
ConcreteBuilder();
~ConcreteBuilder();
virtual void BuilderMethodA();
virtual void BuilderMethodB();
virtual Product *GetProduct();
private:
Product *m_product;
};
#endif // CONCRETEBUILDER_H
// concretebuilder.cpp
#include "concretebuilder.h"
#include <iostream>
ConcreteBuilder::ConcreteBuilder()
{
m_product = new Product();
}
ConcreteBuilder::~ConcreteBuilder()
{
delete m_product;
}
void ConcreteBuilder::BuilderMethodA()
{
m_product->m_iNumA = 111;
}
void ConcreteBuilder::BuilderMethodB()
{
m_product->m_iNumB = 222;
}
Product * ConcreteBuilder::GetProduct()
{
return m_product;
}
// director.h
#ifndef DIRECTOR_H
#define DIRECTOR_H
#include "builder.h"
class Director
{
public:
Director();
virtual void Construct(Builder *builder);
};
#endif // DIRECTOR_H
// director.cpp
#include "director.h"
Director::Director()
{}
void Director::Construct(Builder *builder)
{
builder->BuilderMethodA();
builder->BuilderMethodB();
}
// main.cpp
#include <iostream>
#include "director.h"
#include "concretebuilder.h"
#include "product.h"
using namespace std;
int main(int argc, char *argv[])
{
Director *director = new Director();
Builder *builder = new ConcreteBuilder();
director->Construct(builder);
Product *product = builder->GetProduct();
product->Show();
return 0;
}