before.cxx
#include <iostream>
#include <string>
class Shape {
public:
void setColor(const std::string &colorName) {
this->colorName = colorName;
}
void setKind(const std::string &kindName) {
this->kindName = kindName;
}
void what(void) {
std::cout << "a " << this->colorName << " " << this->kindName << std::endl;
}
private:
std::string colorName;
std::string kindName;
};
int main(void) {
Shape blackCircle;
blackCircle.setColor("black");
blackCircle.setKind("circle");
blackCircle.what();
// Shape whiteSquare;
// blackCircle.setColor("white");
// blackCircle.setKind("square");
// blackCircle.what();
return 0;
}
after.cxx
#include <iostream>
#include <string>
#include "config.hxx"
class Shape {
public:
void setColor(const std::string &colorName) {
this->colorName = colorName;
}
void setKind(const std::string &kindName) {
this->kindName = kindName;
}
void what(void) {
std::cout << "a " << this->colorName << " " << this->kindName << std::endl;
}
private:
std::string colorName;
std::string kindName;
};
class ShapeBuilder {
public:
virtual void buildColor(void) = 0;
virtual void buildKind(void) = 0;
Shape *getResult(void) {
return &this->shape;
}
protected:
Shape shape;
};
class BlackCircleBuilder: public ShapeBuilder {
public:
void buildColor(void) {
this->shape.setColor("black");
}
void buildKind(void) {
this->shape.setKind("circle");
}
};
class WhiteSquareBuilder: public ShapeBuilder {
public:
void buildColor(void) {
this->shape.setColor("white");
}
void buildKind(void) {
this->shape.setKind("square");
}
};
class ShapeDirector {
public:
ShapeDirector(ShapeBuilder *shapeBuilder) {
this->shapeBuilder = shapeBuilder;
}
Shape *construct(void) {
shapeBuilder->buildColor();
shapeBuilder->buildKind();
return shapeBuilder->getResult();
}
private:
ShapeBuilder *shapeBuilder;
};
int main(void) {
ShapeBuilder *shapeBuilder = &_SHAPE_BUILDER_();
ShapeDirector shapeDirector(shapeBuilder);
Shape *shape = shapeDirector.construct();
shape->what();
return 0;
}
config.hxx
#define _SHAPE_BUILDER_ BlackCircleBuilder
// #define _SHAPE_BUILDER_ WhiteSquareBuilder