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. [Декоратор](decorator/)
### Пораждающие
1. [Фабричный метод](factorymethod/)
## Компиляция ## Компиляция
```sh ```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/) данных от субъекта (запрос считается более "правильным"). При использовании паттерна возможен как [запрос](request/), так и [активная доставка](delivery/) данных от субъекта (запрос считается более "правильным").