Created
January 2, 2018 04:54
-
-
Save FONQRI/c3812a5fc89d296c32a44116e19c48a2 to your computer and use it in GitHub Desktop.
Builder Design Pattern in c++
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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