simple factory
This commit is contained in:
parent
90c1b88af9
commit
f197ef0255
|
@ -13,6 +13,10 @@
|
||||||
|
|
||||||
1. [Декоратор](decorator/)
|
1. [Декоратор](decorator/)
|
||||||
|
|
||||||
|
### Пораждающие
|
||||||
|
|
||||||
|
1. [Фабричный метод](factorymethod/)
|
||||||
|
|
||||||
## Компиляция
|
## Компиляция
|
||||||
|
|
||||||
```sh
|
```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/) данных от субъекта (запрос считается более "правильным").
|
При использовании паттерна возможен как [запрос](request/), так и [активная доставка](delivery/) данных от субъекта (запрос считается более "правильным").
|
||||||
|
|
||||||
|
|
Reference in New Issue