From fe8e4cb2351ee820eed4e5aa75a60347604c4622 Mon Sep 17 00:00:00 2001 From: Ian Dinwoodie Date: Sun, 28 Apr 2019 00:51:04 -0400 Subject: [PATCH] Added builder example source code. --- examples/creational/builder.cpp | 114 ++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 examples/creational/builder.cpp diff --git a/examples/creational/builder.cpp b/examples/creational/builder.cpp new file mode 100644 index 0000000..1e57de4 --- /dev/null +++ b/examples/creational/builder.cpp @@ -0,0 +1,114 @@ +#include +#include + +class BurgerBuilder; + +class Burger +{ + public: + typedef std::shared_ptr ptr_t; + 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); + } + + Burger::ptr_t build(void) + { + Burger::ptr_t burger(new Burger(this)); + return burger; + } + + 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. + Burger::ptr_t burger = BurgerBuilder(2). + addPepperoni(). + addLettuce(). + addTomato(). + build(); + // Output: 2 patties, pepperoni, lettuce, tomato + burger->getDescription(); + + // One triple patty buger with everything. + Burger::ptr_t burger2 = BurgerBuilder(3). + addPepperoni(). + addCheese(). + addLettuce(). + addTomato(). + build(); + // Output: 3 patties, cheese, pepperoni, lettuce, tomato + burger2->getDescription(); + + return 0; +}