Created
May 27, 2024 08:06
-
-
Save sunmeat/4e578f61f0a0c38ad6171070f0e51a74 to your computer and use it in GitHub Desktop.
pattern builder C# example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Продукт */ | |
class Pizza | |
{ | |
public string? Dough { get; set; } // корж | |
public string? Sauce { get; set; } // соус | |
public string? Topping { get; set; } // начинка | |
} | |
/* Абстрактный Строитель */ // можно воспринимать, как пиццеола | |
abstract class PizzaBuilder | |
{ | |
protected Pizza? pizza; | |
public Pizza? GetPizza() | |
{ | |
return pizza; | |
} | |
public void CreateNewPizza() | |
{ | |
pizza = new Pizza(); | |
} | |
public abstract void BuildDough(); | |
public abstract void BuildSauce(); | |
public abstract void BuildTopping(); | |
} | |
/* Конкретный Строитель #1 */ // настройки для пиццы по-гавайски | |
class HawaiianPizzaBuilder : PizzaBuilder | |
{ | |
public HawaiianPizzaBuilder() | |
{ | |
Console.WriteLine("Пицца по-гавайски:"); | |
} | |
public override void BuildDough() | |
{ | |
pizza.Dough = "толстый"; | |
Console.WriteLine("толстый коржик"); | |
} | |
public override void BuildSauce() | |
{ | |
pizza.Sauce = "кисло-сладкий"; | |
Console.WriteLine("кисло-сладкий не острый соус"); | |
} | |
public override void BuildTopping() | |
{ | |
pizza.Topping = "куриное филе + ананасы + моцарелла + сушёная зелень"; | |
Console.WriteLine("начинка: куриное филе + ананасы + моцарелла + сушёная зелень"); | |
} | |
} | |
/* Конкретный Строитель #2 */ | |
class SpicyPizzaBuilder : PizzaBuilder | |
{ | |
public SpicyPizzaBuilder() | |
{ | |
Console.WriteLine("Пицца Диаболо:"); | |
} | |
public override void BuildDough() | |
{ | |
pizza.Dough = "тонкий"; | |
Console.WriteLine("тонкий коржик"); | |
} | |
public override void BuildSauce() | |
{ | |
pizza.Sauce = "шрирача"; | |
Console.WriteLine("соус шрирача"); | |
} | |
public override void BuildTopping() | |
{ | |
pizza.Topping = "острый пепперони + маринованый халапеньо + перец чили + моцарелла + перец болгарский + помидор коктейльный"; | |
Console.WriteLine("начинка: острый пепперони + маринованый халапеньо + перец чили + моцарелла + перец болгарский + помидор коктейльный"); | |
} | |
} | |
/* Распорядитель (Директор) */ // официант | |
class Waiter | |
{ | |
private PizzaBuilder? builder; | |
public void SetPizzaBuilder(PizzaBuilder pb) | |
{ | |
builder = pb; | |
} | |
public Pizza? GetPizza() | |
{ | |
return builder.GetPizza(); | |
} | |
public void MakePizza() | |
{ | |
builder.CreateNewPizza(); | |
builder.BuildDough(); | |
builder.BuildSauce(); | |
builder.BuildTopping(); | |
} | |
public void MakePizzaWithoutSauce() | |
{ | |
builder.CreateNewPizza(); | |
builder.BuildDough(); | |
builder.BuildTopping(); | |
} | |
} | |
class Program | |
{ | |
static void Main() | |
{ | |
// приходим в ресторан | |
var waiter = new Waiter(); // подошёл официант | |
// распорядителю передаётся информация о типе конкретного Строителя | |
waiter.SetPizzaBuilder(new HawaiianPizzaBuilder()); // официант принимает заказ | |
// запускаем процесс создания Продукта по умолчанию | |
waiter.MakePizza(); // официант ушёл на кухню в попытках найти Продукт | |
// опционально, можно уточнить заказ | |
// waiter.MakePizzaWithoutSauce(); // а это для тех, кто хочет пиццу без соуса | |
Pizza? pizza = waiter.GetPizza(); // где моя пицца? | |
// приятного аппетита :) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment