simple factory

This commit is contained in:
Alexander Zhirov 2022-11-12 01:22:12 +03:00
parent 90c1b88af9
commit f197ef0255
12 changed files with 213 additions and 2 deletions

View File

@ -13,6 +13,10 @@
1. [Декоратор](decorator/)
### Пораждающие
1. [Фабричный метод](factorymethod/)
## Компиляция
```sh

View File

@ -1,6 +1,6 @@
# Декоратор
Декоратор — это структурный паттерн проектирования, который позволяет динамически добавлять объектам новую функциональность, оборачивая их в полезные «обёртки».
Структурный паттерн проектирования, который позволяет динамически добавлять объектам новую функциональность, оборачивая их в полезные «обёртки».
Типы декораторов соответствуют типам декорируемых компонентов (соответствие достигается посредством наследования или реализации интерфейса). Декораторы изменяют поведение компонентов, добавляя новую функциональность до и (или) после (или даже вместо) вызовов методов компонентов. Компонент может декорироваться любым количеством декораторов. Декораторы обычно прозрачны для клиентов компонента (если клиентский код не зависит от конкретного типа компонента).

7
factorymethod/README.md Normal file
View File

@ -0,0 +1,7 @@
# Фабричный метод
Порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
## Принципы
- По возможности использовать абстракции в коде

View File

@ -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());
}

View File

@ -0,0 +1,15 @@
module factorymethod.pizzasimple.cheesepizza;
import factorymethod.pizzasimple.pizza;
class CheesePizza : Pizza
{
this()
{
name = "Сырная пицца";
dough = "Обычная корочка";
sauce = "Соус для пиццы Маринара";
toppings ~= "Свежая моцарелла";
toppings ~= "Пармезан";
}
}

View File

@ -0,0 +1,15 @@
module factorymethod.pizzasimple.clampizza;
import factorymethod.pizzasimple.pizza;
class ClamPizza : Pizza
{
this()
{
name = "Пицца с моллюсками";
dough = "Тонкая корочка";
sauce = "Белый чесночный соус";
toppings ~= "Моллюски";
toppings ~= "Тертый сыр пармезан";
}
}

View File

@ -0,0 +1,16 @@
module factorymethod.pizzasimple.pepperonipizza;
import factorymethod.pizzasimple.pizza;
class PepperoniPizza : Pizza
{
this()
{
name = "Пицца с пепперони";
dough = "Корка";
sauce = "Соус Маринара";
toppings ~= "Нарезанные пепперони";
toppings ~= "Нарезанный лук";
toppings ~= "Тертый сыр пармезан";
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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 ~= "Нарезанные черные оливки";
}
}

View File

@ -1,6 +1,6 @@
# Наблюдатель
Наблюдатель — это поведенческий паттерн проектирования, который создаёт механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах.
Поведенческий паттерн проектирования, который создаёт механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах.
При использовании паттерна возможен как [запрос](request/), так и [активная доставка](delivery/) данных от субъекта (запрос считается более "правильным").