Skip to content

Instantly share code, notes, and snippets.

@FONQRI
Created January 2, 2018 04:54
Show Gist options
  • Save FONQRI/c3812a5fc89d296c32a44116e19c48a2 to your computer and use it in GitHub Desktop.
Save FONQRI/c3812a5fc89d296c32a44116e19c48a2 to your computer and use it in GitHub Desktop.
Builder Design Pattern in c++
#include <iostream>
#include <memory>
#include <queue>
#include <string>
using namespace std;
// Product
class Meal {
public:
Meal();
void setMealItem(string mealItem);
void serveMeal();
private:
queue<string> mMeal;
};
Meal::Meal() {}
void Meal::setMealItem(string mealItem) { mMeal.push(mealItem); }
void Meal::serveMeal()
{
int i = 1;
while (!mMeal.empty()) {
cout << " Serve item " << i++ << ":" << mMeal.front() << endl;
mMeal.pop();
}
}
// Builder
class MealBuilder {
public:
MealBuilder();
virtual ~MealBuilder();
const Meal &getMeal();
virtual void buildStarter() = 0;
virtual void buildMainCourse() = 0;
virtual void buildDessert() = 0;
protected:
Meal mMeal;
};
MealBuilder::MealBuilder() {}
MealBuilder::~MealBuilder() {}
const Meal &MealBuilder::getMeal() { return mMeal; }
// Director: Makes sure the right sequence of food is prepared and served.
class MultiCuisineCook {
public:
MultiCuisineCook();
~MultiCuisineCook();
void setMealBuilder(shared_ptr<MealBuilder> mealBuilder);
const Meal &getMeal();
void createMeal();
private:
shared_ptr<MealBuilder> mMealBuilder;
};
MultiCuisineCook::MultiCuisineCook() : mMealBuilder(NULL) {}
MultiCuisineCook::~MultiCuisineCook() {}
void MultiCuisineCook::setMealBuilder(shared_ptr<MealBuilder> mealBuilder)
{
mMealBuilder = mealBuilder;
}
const Meal &MultiCuisineCook::getMeal() { return mMealBuilder->getMeal(); }
void MultiCuisineCook::createMeal()
{
mMealBuilder->buildStarter();
mMealBuilder->buildMainCourse();
mMealBuilder->buildDessert();
}
// Concrete Meal Builder 1
class IndianMealBuilder : public MealBuilder {
public:
IndianMealBuilder();
~IndianMealBuilder();
void buildStarter();
void buildMainCourse();
void buildDessert();
};
IndianMealBuilder::IndianMealBuilder() {}
IndianMealBuilder::~IndianMealBuilder() {}
void IndianMealBuilder::buildStarter() { mMeal.setMealItem("FriedOnion"); }
void IndianMealBuilder::buildMainCourse() { mMeal.setMealItem("CheeseCurry"); }
void IndianMealBuilder::buildDessert() { mMeal.setMealItem("SweetBalls"); }
// Concrete Meal Builder 2
class ChineeseMealBuilder : public MealBuilder {
public:
ChineeseMealBuilder();
~ChineeseMealBuilder();
void buildStarter();
void buildMainCourse();
void buildDessert();
};
ChineeseMealBuilder::ChineeseMealBuilder() {}
ChineeseMealBuilder::~ChineeseMealBuilder() {}
void ChineeseMealBuilder::buildStarter() { mMeal.setMealItem("Manchurian"); }
void ChineeseMealBuilder::buildMainCourse()
{
mMeal.setMealItem("FriedNoodles");
}
void ChineeseMealBuilder::buildDessert() { mMeal.setMealItem("MangoPudding"); }
// Concrete Meal Builder 3
class MexicanMealBuilder : public MealBuilder {
public:
MexicanMealBuilder();
~MexicanMealBuilder();
void buildStarter();
void buildMainCourse();
void buildDessert();
};
MexicanMealBuilder::MexicanMealBuilder() {}
MexicanMealBuilder::~MexicanMealBuilder() {}
void MexicanMealBuilder::buildStarter() { mMeal.setMealItem("ChipsNSalsa"); }
void MexicanMealBuilder::buildMainCourse()
{
mMeal.setMealItem("RiceTacoBeans");
}
void MexicanMealBuilder::buildDessert() { mMeal.setMealItem("FriedIcecream"); }
int main()
{
MultiCuisineCook cook;
cout << "Build a Chineese Meal!" << endl;
cook.setMealBuilder(make_shared<ChineeseMealBuilder>());
cook.createMeal();
Meal chineeseMeal = cook.getMeal();
chineeseMeal.serveMeal();
cout << "Build a Mexican Meal!" << endl;
cook.setMealBuilder(make_shared<MexicanMealBuilder>());
cook.createMeal();
Meal mexicanMeal = cook.getMeal();
mexicanMeal.serveMeal();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment