Паттерн Абстрактная Фабрика предоставляет интерфейс создания семейств взаимосвязанных или взаимозависимых объектов без указания их конкретных классов.
Разница между Абстрактной фабрикой и абстрактным методом в том, что абстрактный метод использует наследования, абстрактная фабрика композицию.
Я упростил пример из фабричного метода, чтобы не перегружать его кодом, так как пришлось бы для каждого вида начинок, вариаций пицц итд еще создавать фабрики.
Из кода ниже мы видим, что была создан интерфейс пиццы IPizza в нем, имеют методы и свойства, интерфейс этот был реализован в классе конкретных пицц Итальянской и Американской. Далее я создал интерфейс фабрики, по приготовлению наших двух видов пицц. Реализовал я IPizzaFactory в конкретном классе фабрики, создал структуру метод по созданию объектов пиццы. В метода Main я создал экземпляр фабрики и создал на ней 2 вида пиццы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Абстрактная_Фабрика { public interface IPizza { string Name { get; set; } string Dough { get; set; } string Sauce { get; set; } void Prepare(); void Bake(); void Cut(); void Box(); } public class ItaliaStylePizza : IPizza { public ItaliaStylePizza() { Name = "Итальянская пицца с соусом и сыром"; Dough = "Тесто на тонкой основе"; Sauce = "Специальны соус"; Console.WriteLine("Итальянская пицца с сыром"); } public string Name { get; set; } public string Dough { get; set ; } public string Sauce { get; set; } public void Bake() => Console.WriteLine("Печем пиццу 25 минут"); public void Box() => Console.WriteLine("Упаковываем пиццу в коробку"); public void Cut() => Console.WriteLine("Нарезаем пиццу по диагонали"); public void Prepare() { Console.WriteLine("Готовим пиццу"); Console.WriteLine("Готовим: " + Name); Console.WriteLine("Подбрасываем тесто: " + Dough); Console.WriteLine("Добавляем соус"); } } public class AmericanoStylePizza : IPizza { public AmericanoStylePizza() { Name = "Американская пицца с соусом и сыром"; Dough = "Тесто на тонкой основе"; Sauce = "Специальны соус"; Console.WriteLine("Американская пицца с сыром"); } public string Name { get; set; } public string Dough { get; set; } public string Sauce { get; set; } public void Bake() => Console.WriteLine("Печем пиццу 25 минут"); public void Box() => Console.WriteLine("Упаковываем пиццу в коробку"); public void Cut() => Console.WriteLine("Нарезаем пиццу по диагонали"); public void Prepare() { Console.WriteLine("Готовим пиццу"); Console.WriteLine("Готовим: " + Name); Console.WriteLine("Подбрасываем тесто: " + Dough); Console.WriteLine("Добавляем соус"); } } interface IPizzaFactory { IPizza CreateAmericanoStylePizza(); IPizza CreateItaliaStylePizza(); } class ConcreteFactoryPizza : IPizzaFactory { public IPizza CreateAmericanoStylePizza() { return new AmericanoStylePizza(); } public IPizza CreateItaliaStylePizza() { return new ItaliaStylePizza(); } } class Program { static void Main(string[] args) { IPizzaFactory factory = new ConcreteFactoryPizza(); IPizza pizzaAmericano = factory.CreateAmericanoStylePizza(); pizzaAmericano.Prepare(); Console.WriteLine(new string('-',50)); IPizza pizzaItalio = factory.CreateItaliaStylePizza(); pizzaItalio.Prepare(); Console.ReadKey(); } } } |