factory method
This commit is contained in:
parent
f9c95af5ff
commit
8bfa03ce82
|
@ -2,6 +2,8 @@
|
|||
|
||||
Порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
|
||||
|
||||
Паттерн **Фабричный Метод** определяет интерфейс создания объекта, но позволяет субклассам выбрать создаваемый экземпляр. Таким образом, Фабричный Метод делегирует операцию создания экземпляра субклассам.
|
||||
|
||||
## Принципы
|
||||
|
||||
- По возможности использовать абстракции в коде
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
module factorymethod.pizzafactorymethod.app;
|
||||
|
||||
import factorymethod.pizzafactorymethod.pizza;
|
||||
import factorymethod.pizzafactorymethod.pizzastore;
|
||||
import factorymethod.pizzafactorymethod.nypizzastore;
|
||||
import factorymethod.pizzafactorymethod.chicagopizzastore;
|
||||
import std.stdio : writeln;
|
||||
|
||||
void main()
|
||||
{
|
||||
PizzaStore nyStore = new NYPizzaStore();
|
||||
PizzaStore chicagoStore = new ChicagoPizzaStore();
|
||||
|
||||
Pizza pizza = nyStore.orderPizza("cheese");
|
||||
writeln("Ethan ordered a ", pizza.getName());
|
||||
|
||||
pizza = chicagoStore.orderPizza("cheese");
|
||||
writeln("Joel ordered a ", pizza.getName());
|
||||
|
||||
pizza = nyStore.orderPizza("clam");
|
||||
writeln("Ethan ordered a ", pizza.getName());
|
||||
|
||||
pizza = chicagoStore.orderPizza("clam");
|
||||
writeln("Joel ordered a ", pizza.getName());
|
||||
|
||||
pizza = nyStore.orderPizza("pepperoni");
|
||||
writeln("Ethan ordered a ", pizza.getName());
|
||||
|
||||
pizza = chicagoStore.orderPizza("pepperoni");
|
||||
writeln("Joel ordered a ", pizza.getName());
|
||||
|
||||
pizza = nyStore.orderPizza("veggie");
|
||||
writeln("Ethan ordered a ", pizza.getName());
|
||||
|
||||
pizza = chicagoStore.orderPizza("veggie");
|
||||
writeln("Joel ordered a ", pizza.getName());
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
module factorymethod.pizzafactorymethod.chicagopizzastore;
|
||||
|
||||
import factorymethod.pizzafactorymethod.pizza;
|
||||
import factorymethod.pizzafactorymethod.pizzastore;
|
||||
import factorymethod.pizzafactorymethod.chicagostylecheesepizza;
|
||||
import factorymethod.pizzafactorymethod.chicagostyleclampizza;
|
||||
import factorymethod.pizzafactorymethod.chicagostylepepperonipizza;
|
||||
import factorymethod.pizzafactorymethod.chicagostyleveggiepizza;
|
||||
|
||||
class ChicagoPizzaStore : PizzaStore
|
||||
{
|
||||
override Pizza createPizza(string item)
|
||||
{
|
||||
if (item == "cheese")
|
||||
{
|
||||
return new ChicagoStyleCheesePizza();
|
||||
}
|
||||
else if (item == "veggie")
|
||||
{
|
||||
return new ChicagoStyleVeggiePizza();
|
||||
}
|
||||
else if (item == "clam")
|
||||
{
|
||||
return new ChicagoStyleClamPizza();
|
||||
}
|
||||
else if (item == "pepperoni")
|
||||
{
|
||||
return new ChicagoStylePepperoniPizza();
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
module factorymethod.pizzafactorymethod.chicagostylecheesepizza;
|
||||
|
||||
import factorymethod.pizzafactorymethod.pizza;
|
||||
import std.stdio : writeln;
|
||||
|
||||
class ChicagoStyleCheesePizza : Pizza
|
||||
{
|
||||
this()
|
||||
{
|
||||
name = "Chicago Style Deep Dish Cheese Pizza";
|
||||
dough = "Extra Thick Crust Dough";
|
||||
sauce = "Plum Tomato Sauce";
|
||||
|
||||
toppings ~= "Shredded Mozzarella Cheese";
|
||||
}
|
||||
|
||||
override void cut()
|
||||
{
|
||||
writeln("Cutting the pizza into square slices");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
module factorymethod.pizzafactorymethod.chicagostyleclampizza;
|
||||
|
||||
import factorymethod.pizzafactorymethod.pizza;
|
||||
import std.stdio : writeln;
|
||||
|
||||
class ChicagoStyleClamPizza : Pizza
|
||||
{
|
||||
this()
|
||||
{
|
||||
name = "Chicago Style Clam Pizza";
|
||||
dough = "Extra Thick Crust Dough";
|
||||
sauce = "Plum Tomato Sauce";
|
||||
|
||||
toppings ~= "Shredded Mozzarella Cheese";
|
||||
toppings ~= "Frozen Clams from Chesapeake Bay";
|
||||
}
|
||||
|
||||
override void cut()
|
||||
{
|
||||
writeln("Cutting the pizza into square slices");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
module factorymethod.pizzafactorymethod.chicagostylepepperonipizza;
|
||||
|
||||
import factorymethod.pizzafactorymethod.pizza;
|
||||
import std.stdio : writeln;
|
||||
|
||||
class ChicagoStylePepperoniPizza : Pizza
|
||||
{
|
||||
this()
|
||||
{
|
||||
name = "Chicago Style Pepperoni Pizza";
|
||||
dough = "Extra Thick Crust Dough";
|
||||
sauce = "Plum Tomato Sauce";
|
||||
|
||||
toppings ~= "Shredded Mozzarella Cheese";
|
||||
toppings ~= "Black Olives";
|
||||
toppings ~= "Spinach";
|
||||
toppings ~= "Eggplant";
|
||||
toppings ~= "Sliced Pepperoni";
|
||||
}
|
||||
|
||||
override void cut()
|
||||
{
|
||||
writeln("Cutting the pizza into square slices");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
module factorymethod.pizzafactorymethod.chicagostyleveggiepizza;
|
||||
|
||||
import factorymethod.pizzafactorymethod.pizza;
|
||||
import std.stdio : writeln;
|
||||
|
||||
class ChicagoStyleVeggiePizza : Pizza
|
||||
{
|
||||
this()
|
||||
{
|
||||
name = "Chicago Deep Dish Veggie Pizza";
|
||||
dough = "Extra Thick Crust Dough";
|
||||
sauce = "Plum Tomato Sauce";
|
||||
|
||||
toppings ~= "Shredded Mozzarella Cheese";
|
||||
toppings ~= "Black Olives";
|
||||
toppings ~= "Spinach";
|
||||
toppings ~= "Eggplant";
|
||||
}
|
||||
|
||||
override void cut()
|
||||
{
|
||||
writeln("Cutting the pizza into square slices");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
module factorymethod.pizzafactorymethod.nypizzastore;
|
||||
|
||||
import factorymethod.pizzafactorymethod.pizza;
|
||||
import factorymethod.pizzafactorymethod.pizzastore;
|
||||
import factorymethod.pizzafactorymethod.nystylecheesepizza;
|
||||
import factorymethod.pizzafactorymethod.nystyleclampizza;
|
||||
import factorymethod.pizzafactorymethod.nystylepepperonipizza;
|
||||
import factorymethod.pizzafactorymethod.nystyleveggiepizza;
|
||||
|
||||
class NYPizzaStore : PizzaStore
|
||||
{
|
||||
override Pizza createPizza(string item)
|
||||
{
|
||||
if (item == "cheese")
|
||||
{
|
||||
return new NYStyleCheesePizza();
|
||||
}
|
||||
else if (item == "veggie")
|
||||
{
|
||||
return new NYStyleVeggiePizza();
|
||||
}
|
||||
else if (item == "clam")
|
||||
{
|
||||
return new NYStyleClamPizza();
|
||||
}
|
||||
else if (item == "pepperoni")
|
||||
{
|
||||
return new NYStylePepperoniPizza();
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
module factorymethod.pizzafactorymethod.nystylecheesepizza;
|
||||
|
||||
import factorymethod.pizzafactorymethod.pizza;
|
||||
|
||||
class NYStyleCheesePizza : Pizza
|
||||
{
|
||||
this()
|
||||
{
|
||||
name = "NY Style Sauce and Cheese Pizza";
|
||||
dough = "Thin Crust Dough";
|
||||
sauce = "Marinara Sauce";
|
||||
|
||||
toppings ~= "Grated Reggiano Cheese";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
module factorymethod.pizzafactorymethod.nystyleclampizza;
|
||||
|
||||
import factorymethod.pizzafactorymethod.pizza;
|
||||
|
||||
class NYStyleClamPizza : Pizza
|
||||
{
|
||||
this()
|
||||
{
|
||||
name = "NY Style Clam Pizza";
|
||||
dough = "Thin Crust Dough";
|
||||
sauce = "Marinara Sauce";
|
||||
|
||||
toppings ~= "Grated Reggiano Cheese";
|
||||
toppings ~= "Fresh Clams from Long Island Sound";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
module factorymethod.pizzafactorymethod.nystylepepperonipizza;
|
||||
|
||||
import factorymethod.pizzafactorymethod.pizza;
|
||||
|
||||
class NYStylePepperoniPizza : Pizza
|
||||
{
|
||||
this()
|
||||
{
|
||||
name = "NY Style Pepperoni Pizza";
|
||||
dough = "Thin Crust Dough";
|
||||
sauce = "Marinara Sauce";
|
||||
|
||||
toppings ~= "Grated Reggiano Cheese";
|
||||
toppings ~= "Sliced Pepperoni";
|
||||
toppings ~= "Garlic";
|
||||
toppings ~= "Onion";
|
||||
toppings ~= "Mushrooms";
|
||||
toppings ~= "Red Pepper";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
module factorymethod.pizzafactorymethod.nystyleveggiepizza;
|
||||
|
||||
import factorymethod.pizzafactorymethod.pizza;
|
||||
|
||||
class NYStyleVeggiePizza : Pizza
|
||||
{
|
||||
this()
|
||||
{
|
||||
name = "NY Style Veggie Pizza";
|
||||
dough = "Thin Crust Dough";
|
||||
sauce = "Marinara Sauce";
|
||||
|
||||
toppings ~= "Grated Reggiano Cheese";
|
||||
toppings ~= "Garlic";
|
||||
toppings ~= "Onion";
|
||||
toppings ~= "Mushrooms";
|
||||
toppings ~= "Red Pepper";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
module factorymethod.pizzafactorymethod.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("Prepare " ~ name);
|
||||
writeln("Tossing dough...");
|
||||
writeln("Adding sauce...");
|
||||
writeln("Adding toppings: ");
|
||||
foreach (val; toppings)
|
||||
{
|
||||
writeln(" " ~ val);
|
||||
}
|
||||
}
|
||||
|
||||
void bake()
|
||||
{
|
||||
writeln("Bake for 25 minutes at 350");
|
||||
}
|
||||
|
||||
void cut()
|
||||
{
|
||||
writeln("Cut the pizza into diagonal slices");
|
||||
}
|
||||
|
||||
void box()
|
||||
{
|
||||
writeln("Place pizza in official PizzaStore box");
|
||||
}
|
||||
|
||||
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,23 @@
|
|||
module factorymethod.pizzafactorymethod.pizzastore;
|
||||
|
||||
import factorymethod.pizzafactorymethod.pizza;
|
||||
import std.stdio : writeln;
|
||||
|
||||
class PizzaStore
|
||||
{
|
||||
abstract Pizza createPizza(string type);
|
||||
|
||||
Pizza orderPizza(string type)
|
||||
{
|
||||
Pizza pizza = createPizza(type);
|
||||
|
||||
writeln("--- Making a " ~ pizza.getName() ~ " ---");
|
||||
|
||||
pizza.prepare();
|
||||
pizza.bake();
|
||||
pizza.cut();
|
||||
pizza.box();
|
||||
|
||||
return pizza;
|
||||
}
|
||||
}
|
Reference in New Issue