Std::string topping; // гарнир
public: Pizza() { } ~Pizza() { } void SetDough(const std::string& d) { dough = d; }; void SetSauce(const std::string& s) { sauce = s; }; void SetTopping(const std::string& t) { topping = t; } void ShowPizza() { Std::cout << " Yummy!!!" << std::endl Lt;< "Pizza with Dough as " << dough Lt;< ", Sauce as " << sauce Lt;< " and Topping as " << topping << "!!! " << std::endl; } }; Abstract Builder Class PizzaBuilder { protected: std::auto_ptr<Pizza> pizza; public: PizzaBuilder() {} virtual ~PizzaBuilder() {} std::auto_ptr<Pizza> GetPizza() { return pizza; } void createNewPizzaProduct() { pizza.reset (new Pizza); } virtual void buildDough()=0; virtual void buildSauce()=0; virtual void buildTopping()=0; }; ConcreteBuilder 1 Class HawaiianPizzaBuilder: public PizzaBuilder { public: HawaiianPizzaBuilder(): PizzaBuilder() {} ~HawaiianPizzaBuilder(){} void buildDough() { pizza->SetDough("cross"); } void buildSauce() { pizza->SetSauce("mild"); } void buildTopping() { pizza->SetTopping("ham and pineapple"); } }; ConcreteBuilder 2 Class SpicyPizzaBuilder: public PizzaBuilder { public: SpicyPizzaBuilder(): PizzaBuilder() {} ~SpicyPizzaBuilder() {} void buildDough() { pizza->SetDough("pan baked"); } void buildSauce() { pizza->SetSauce("hot"); } void buildTopping() { pizza->SetTopping("pepperoni and salami"); } }; // Director (Распорядитель) Class Waiter // официант { private: PizzaBuilder* pizzaBuilder; public: Waiter(): pizzaBuilder(NULL) {} ~Waiter() { } void SetPizzaBuilder(PizzaBuilder* b) { pizzaBuilder = b; } std::auto_ptr<Pizza> GetPizza() { return pizzaBuilder->GetPizza(); } void ConstructPizza() { pizzaBuilder->createNewPizzaProduct(); pizzaBuilder->buildDough(); pizzaBuilder->buildSauce(); pizzaBuilder->buildTopping(); } }; Клиент заказывает две пиццы. int main() { Waiter waiter; // устанавливается общий Распорядитель HawaiianPizzaBuilder hawaiianPizzaBuilder; //конкретный строитель 1 Waiter.SetPizzaBuilder (&hawaiianPizzaBuilder); // сообщаем его Распорядителю Waiter.ConstructPizza(); // создание продукта методами конкретного Продукта waiter.GetPizza() -> ShowPizza(); SpicyPizzaBuilder spicyPizzaBuilder; waiter.SetPizzaBuilder(&spicyPizzaBuilder); waiter.ConstructPizza(); waiter.GetPizza();->ShowPizza(); return EXIT_SUCCESS; }
Фабричный метод Фабричный метод — порождающий шаблон проектирования, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс инстанциировать. Иными словами, Фабрика делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне. Также известен под названием виртуальный конструктор.
|