simple factory
This commit is contained in:
parent
90c1b88af9
commit
f197ef0255
|
@ -13,6 +13,10 @@
|
|||
|
||||
1. [Декоратор](decorator/)
|
||||
|
||||
### Пораждающие
|
||||
|
||||
1. [Фабричный метод](factorymethod/)
|
||||
|
||||
## Компиляция
|
||||
|
||||
```sh
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# Декоратор
|
||||
|
||||
Декоратор — это структурный паттерн проектирования, который позволяет динамически добавлять объектам новую функциональность, оборачивая их в полезные «обёртки».
|
||||
Структурный паттерн проектирования, который позволяет динамически добавлять объектам новую функциональность, оборачивая их в полезные «обёртки».
|
||||
|
||||
Типы декораторов соответствуют типам декорируемых компонентов (соответствие достигается посредством наследования или реализации интерфейса). Декораторы изменяют поведение компонентов, добавляя новую функциональность до и (или) после (или даже вместо) вызовов методов компонентов. Компонент может декорироваться любым количеством декораторов. Декораторы обычно прозрачны для клиентов компонента (если клиентский код не зависит от конкретного типа компонента).
|
||||
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
# Фабричный метод
|
||||
|
||||
Порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
|
||||
|
||||
## Принципы
|
||||
|
||||
- По возможности использовать абстракции в коде
|
|
@ -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());
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
module factorymethod.pizzasimple.cheesepizza;
|
||||
|
||||
import factorymethod.pizzasimple.pizza;
|
||||
|
||||
class CheesePizza : Pizza
|
||||
{
|
||||
this()
|
||||
{
|
||||
name = "Сырная пицца";
|
||||
dough = "Обычная корочка";
|
||||
sauce = "Соус для пиццы Маринара";
|
||||
toppings ~= "Свежая моцарелла";
|
||||
toppings ~= "Пармезан";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
module factorymethod.pizzasimple.clampizza;
|
||||
|
||||
import factorymethod.pizzasimple.pizza;
|
||||
|
||||
class ClamPizza : Pizza
|
||||
{
|
||||
this()
|
||||
{
|
||||
name = "Пицца с моллюсками";
|
||||
dough = "Тонкая корочка";
|
||||
sauce = "Белый чесночный соус";
|
||||
toppings ~= "Моллюски";
|
||||
toppings ~= "Тертый сыр пармезан";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
module factorymethod.pizzasimple.pepperonipizza;
|
||||
|
||||
import factorymethod.pizzasimple.pizza;
|
||||
|
||||
class PepperoniPizza : Pizza
|
||||
{
|
||||
this()
|
||||
{
|
||||
name = "Пицца с пепперони";
|
||||
dough = "Корка";
|
||||
sauce = "Соус Маринара";
|
||||
toppings ~= "Нарезанные пепперони";
|
||||
toppings ~= "Нарезанный лук";
|
||||
toppings ~= "Тертый сыр пармезан";
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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 ~= "Нарезанные черные оливки";
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
# Наблюдатель
|
||||
|
||||
Наблюдатель — это поведенческий паттерн проектирования, который создаёт механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах.
|
||||
Поведенческий паттерн проектирования, который создаёт механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах.
|
||||
|
||||
При использовании паттерна возможен как [запрос](request/), так и [активная доставка](delivery/) данных от субъекта (запрос считается более "правильным").
|
||||
|
||||
|
|
Reference in New Issue