Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created May 27, 2024 08:06
Show Gist options
  • Save sunmeat/4e578f61f0a0c38ad6171070f0e51a74 to your computer and use it in GitHub Desktop.
Save sunmeat/4e578f61f0a0c38ad6171070f0e51a74 to your computer and use it in GitHub Desktop.
pattern builder C# example
/* Продукт */
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