From f197ef025587b17e19838cd137101c22d1810535 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 12 Nov 2022 01:22:12 +0300 Subject: [PATCH] simple factory --- README.md | 4 ++ decorator/README.md | 2 +- factorymethod/README.md | 7 +++ factorymethod/pizzasimple/app.d | 24 +++++++++ factorymethod/pizzasimple/cheesepizza.d | 15 ++++++ factorymethod/pizzasimple/clampizza.d | 15 ++++++ factorymethod/pizzasimple/pepperonipizza.d | 16 ++++++ factorymethod/pizzasimple/pizza.d | 50 +++++++++++++++++++ factorymethod/pizzasimple/pizzastore.d | 28 +++++++++++ .../pizzasimple/simplepizzafactory.d | 33 ++++++++++++ factorymethod/pizzasimple/veggiepizza.d | 19 +++++++ observer/README.md | 2 +- 12 files changed, 213 insertions(+), 2 deletions(-) create mode 100644 factorymethod/README.md create mode 100644 factorymethod/pizzasimple/app.d create mode 100644 factorymethod/pizzasimple/cheesepizza.d create mode 100644 factorymethod/pizzasimple/clampizza.d create mode 100644 factorymethod/pizzasimple/pepperonipizza.d create mode 100644 factorymethod/pizzasimple/pizza.d create mode 100644 factorymethod/pizzasimple/pizzastore.d create mode 100644 factorymethod/pizzasimple/simplepizzafactory.d create mode 100644 factorymethod/pizzasimple/veggiepizza.d diff --git a/README.md b/README.md index e915124..dab9997 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,10 @@ 1. [Декоратор](decorator/) +### Пораждающие + +1. [Фабричный метод](factorymethod/) + ## Компиляция ```sh diff --git a/decorator/README.md b/decorator/README.md index 7cd41a0..71a3f4d 100644 --- a/decorator/README.md +++ b/decorator/README.md @@ -1,6 +1,6 @@ # Декоратор -Декоратор — это структурный паттерн проектирования, который позволяет динамически добавлять объектам новую функциональность, оборачивая их в полезные «обёртки». +Структурный паттерн проектирования, который позволяет динамически добавлять объектам новую функциональность, оборачивая их в полезные «обёртки». Типы декораторов соответствуют типам декорируемых компонентов (соответствие достигается посредством наследования или реализации интерфейса). Декораторы изменяют поведение компонентов, добавляя новую функциональность до и (или) после (или даже вместо) вызовов методов компонентов. Компонент может декорироваться любым количеством декораторов. Декораторы обычно прозрачны для клиентов компонента (если клиентский код не зависит от конкретного типа компонента). diff --git a/factorymethod/README.md b/factorymethod/README.md new file mode 100644 index 0000000..658a931 --- /dev/null +++ b/factorymethod/README.md @@ -0,0 +1,7 @@ +# Фабричный метод + +Порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов. + +## Принципы + +- По возможности использовать абстракции в коде diff --git a/factorymethod/pizzasimple/app.d b/factorymethod/pizzasimple/app.d new file mode 100644 index 0000000..8d920c9 --- /dev/null +++ b/factorymethod/pizzasimple/app.d @@ -0,0 +1,24 @@ +module factorymethod.pizzasimple.app; + +import factorymethod.pizzasimple.simplepizzafactory; +import factorymethod.pizzasimple.pizzastore; +import factorymethod.pizzasimple.pizza; +import std.stdio : writeln; + +void main() +{ + SimplePizzaFactory factory = new SimplePizzaFactory(); + PizzaStore store = new PizzaStore(factory); + + Pizza pizza = store.orderPizza("cheese"); + writeln("Мы заказали ", pizza.getName()); + writeln(pizza); + + pizza = store.orderPizza("veggie"); + writeln("Мы заказали ", pizza.getName()); + writeln(pizza.toString()); + + pizza = store.orderPizza("pepperoni"); + writeln("Мы заказали ", pizza.getName()); + writeln(pizza.toString()); +} diff --git a/factorymethod/pizzasimple/cheesepizza.d b/factorymethod/pizzasimple/cheesepizza.d new file mode 100644 index 0000000..100fc75 --- /dev/null +++ b/factorymethod/pizzasimple/cheesepizza.d @@ -0,0 +1,15 @@ +module factorymethod.pizzasimple.cheesepizza; + +import factorymethod.pizzasimple.pizza; + +class CheesePizza : Pizza +{ + this() + { + name = "Сырная пицца"; + dough = "Обычная корочка"; + sauce = "Соус для пиццы Маринара"; + toppings ~= "Свежая моцарелла"; + toppings ~= "Пармезан"; + } +} diff --git a/factorymethod/pizzasimple/clampizza.d b/factorymethod/pizzasimple/clampizza.d new file mode 100644 index 0000000..4292941 --- /dev/null +++ b/factorymethod/pizzasimple/clampizza.d @@ -0,0 +1,15 @@ +module factorymethod.pizzasimple.clampizza; + +import factorymethod.pizzasimple.pizza; + +class ClamPizza : Pizza +{ + this() + { + name = "Пицца с моллюсками"; + dough = "Тонкая корочка"; + sauce = "Белый чесночный соус"; + toppings ~= "Моллюски"; + toppings ~= "Тертый сыр пармезан"; + } +} diff --git a/factorymethod/pizzasimple/pepperonipizza.d b/factorymethod/pizzasimple/pepperonipizza.d new file mode 100644 index 0000000..a992744 --- /dev/null +++ b/factorymethod/pizzasimple/pepperonipizza.d @@ -0,0 +1,16 @@ +module factorymethod.pizzasimple.pepperonipizza; + +import factorymethod.pizzasimple.pizza; + +class PepperoniPizza : Pizza +{ + this() + { + name = "Пицца с пепперони"; + dough = "Корка"; + sauce = "Соус Маринара"; + toppings ~= "Нарезанные пепперони"; + toppings ~= "Нарезанный лук"; + toppings ~= "Тертый сыр пармезан"; + } +} diff --git a/factorymethod/pizzasimple/pizza.d b/factorymethod/pizzasimple/pizza.d new file mode 100644 index 0000000..07980f7 --- /dev/null +++ b/factorymethod/pizzasimple/pizza.d @@ -0,0 +1,50 @@ +module factorymethod.pizzasimple.pizza; + +import std.stdio : writeln; + +abstract class Pizza +{ +protected: + string name; + string dough; + string sauce; + string[] toppings; +public: + string getName() + { + return name; + } + + void prepare() + { + writeln("Подготовка " ~ name); + } + + void bake() + { + writeln("Выпечка " ~ name); + } + + void cut() + { + writeln("Резка " ~ name); + } + + void box() + { + writeln("Упаковка " ~ name); + } + + override string toString() const @safe pure nothrow + { + string s; + s ~= "---- " ~ name ~ " ----\n"; + s ~= dough ~ "\n"; + s ~= sauce ~ "\n"; + foreach (val; toppings) + { + s ~= val ~ '\n'; + } + return s; + } +} diff --git a/factorymethod/pizzasimple/pizzastore.d b/factorymethod/pizzasimple/pizzastore.d new file mode 100644 index 0000000..9c94b81 --- /dev/null +++ b/factorymethod/pizzasimple/pizzastore.d @@ -0,0 +1,28 @@ +module factorymethod.pizzasimple.pizzastore; + +import factorymethod.pizzasimple.simplepizzafactory; +import factorymethod.pizzasimple.pizza; + +class PizzaStore +{ + SimplePizzaFactory factory; + + this(SimplePizzaFactory factory) + { + this.factory = factory; + } + + Pizza orderPizza(string type) + { + Pizza pizza; + + pizza = factory.createPizza(type); + + pizza.prepare(); + pizza.bake(); + pizza.cut(); + pizza.box(); + + return pizza; + } +} diff --git a/factorymethod/pizzasimple/simplepizzafactory.d b/factorymethod/pizzasimple/simplepizzafactory.d new file mode 100644 index 0000000..b2238be --- /dev/null +++ b/factorymethod/pizzasimple/simplepizzafactory.d @@ -0,0 +1,33 @@ +module factorymethod.pizzasimple.simplepizzafactory; + +import factorymethod.pizzasimple.pizza; +import factorymethod.pizzasimple.cheesepizza; +import factorymethod.pizzasimple.pepperonipizza; +import factorymethod.pizzasimple.clampizza; +import factorymethod.pizzasimple.veggiepizza; + +class SimplePizzaFactory +{ + Pizza createPizza(string type) + { + Pizza pizza = null; + + if (type == "cheese") + { + pizza = new CheesePizza(); + } + else if (type == "pepperoni") + { + pizza = new PepperoniPizza(); + } + else if (type == "clam") + { + pizza = new ClamPizza(); + } + else if (type == "veggie") + { + pizza = new VeggiePizza(); + } + return pizza; + } +} diff --git a/factorymethod/pizzasimple/veggiepizza.d b/factorymethod/pizzasimple/veggiepizza.d new file mode 100644 index 0000000..a62e1b1 --- /dev/null +++ b/factorymethod/pizzasimple/veggiepizza.d @@ -0,0 +1,19 @@ +module factorymethod.pizzasimple.veggiepizza; + +import factorymethod.pizzasimple.pizza; + +class VeggiePizza : Pizza +{ + this() + { + name = "Вегетарианская пицца"; + dough = "Корка"; + sauce = "Соус Маринара"; + toppings ~= "Тертая моцарелла"; + toppings ~= "Тертый пармезан"; + toppings ~= "Нарезанный кубиками лук"; + toppings ~= "Нарезанные грибы"; + toppings ~= "Нарезанный красный перец"; + toppings ~= "Нарезанные черные оливки"; + } +} diff --git a/observer/README.md b/observer/README.md index aecc853..d2a5f5d 100644 --- a/observer/README.md +++ b/observer/README.md @@ -1,6 +1,6 @@ # Наблюдатель -Наблюдатель — это поведенческий паттерн проектирования, который создаёт механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах. +Поведенческий паттерн проектирования, который создаёт механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах. При использовании паттерна возможен как [запрос](request/), так и [активная доставка](delivery/) данных от субъекта (запрос считается более "правильным").