Files
cpp-design-patterns-for-humans/examples/creational/builder.cpp
Ian Dinwoodie 092d1a21f9 Rolling back use of typedef with smart pointers.
This is to reduce the obfuscation of the code.
2019-05-14 19:19:26 -04:00

113 lines
2.0 KiB
C++

#include <iostream>
#include <memory>
class BurgerBuilder;
class Burger
{
public:
Burger(BurgerBuilder* builder);
void getDescription(void);
private:
int patties_;
bool cheese_;
bool pepperoni_;
bool lettuce_;
bool tomato_;
};
class BurgerBuilder
{
public:
BurgerBuilder(int patties)
: patties(patties), cheese(false), pepperoni(false), lettuce(false),
tomato(false)
{
}
BurgerBuilder& addCheese(void)
{
cheese = true;
return (*this);
}
BurgerBuilder& addPepperoni(void)
{
pepperoni = true;
return (*this);
}
BurgerBuilder& addLettuce(void)
{
lettuce = true;
return (*this);
}
BurgerBuilder& addTomato(void)
{
tomato = true;
return (*this);
}
std::shared_ptr<Burger> build(void)
{
return std::make_shared<Burger>(this);
}
int patties;
bool cheese;
bool pepperoni;
bool lettuce;
bool tomato;
};
Burger::Burger(BurgerBuilder* builder)
: patties_(builder->patties), cheese_(builder->cheese),
pepperoni_(builder->pepperoni), lettuce_(builder->lettuce),
tomato_(builder->tomato)
{
}
void Burger::getDescription(void)
{
std::cout << patties_ << " patties";
if (cheese_) {
std::cout << ", cheese";
}
if (pepperoni_) {
std::cout << ", pepperoni";
}
if (lettuce_){
std::cout << ", lettuce";
}
if (tomato_) {
std::cout << ", tomato";
}
std::cout << std::endl;
}
int main()
{
// One double patty burger with no dairy.
std::shared_ptr<Burger> burger = BurgerBuilder(2).
addPepperoni().
addLettuce().
addTomato().
build();
// Output: 2 patties, pepperoni, lettuce, tomato
burger->getDescription();
// One triple patty buger with everything.
std::shared_ptr<Burger> burger2 = BurgerBuilder(3).
addPepperoni().
addCheese().
addLettuce().
addTomato().
build();
// Output: 3 patties, cheese, pepperoni, lettuce, tomato
burger2->getDescription();
return 0;
}