Skip to content

Commit ace6f88

Browse files
committed
#Feature Add Builder Pattern Demo - Pizza Builder
1 parent 86b84fa commit ace6f88

3 files changed

Lines changed: 150 additions & 2 deletions

File tree

SRC/DesignPatterns.Creational/DesignPatterns.Creational.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10-
<Folder Include="PatternBuilder\" />
1110
<Folder Include="PatternPrototype\" />
1211
</ItemGroup>
1312

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
namespace DesignPatterns.Creational.PatternBuilder;
2+
3+
public class Pizza
4+
{
5+
public string Size { get; set; } = "Medium";
6+
public string Crust { get; set; } = "Regular";
7+
public List<string> Toppings { get; set; } = new();
8+
9+
public override string ToString()
10+
{
11+
var toppings = Toppings.Count > 0 ? string.Join(", ", Toppings) : "No Toppings";
12+
return $"Size: {Size}, Crust: {Crust}, Toppings: {toppings}";
13+
}
14+
}
15+
16+
public interface IPizzaBuilder
17+
{
18+
void SetSize(string size);
19+
void SetCrust(string crust);
20+
void AddTopping(string topping);
21+
Pizza Build();
22+
}
23+
24+
public class VeggiePizzaBuilder : IPizzaBuilder
25+
{
26+
private Pizza pizza = new();
27+
28+
public void SetSize(string size) => pizza.Size = size;
29+
public void SetCrust(string crust) => pizza.Crust = crust;
30+
public void AddTopping(string topping) => pizza.Toppings.Add(topping);
31+
public Pizza Build()
32+
{
33+
var result = pizza;
34+
pizza = new(); // Reset for next build
35+
return result;
36+
}
37+
}
38+
39+
public class MeatPizzaBuilder : IPizzaBuilder
40+
{
41+
private Pizza pizza = new();
42+
43+
public void SetSize(string size) => pizza.Size = size;
44+
public void SetCrust(string crust) => pizza.Crust = crust;
45+
public void AddTopping(string topping) => pizza.Toppings.Add(topping);
46+
public Pizza Build()
47+
{
48+
var result = pizza;
49+
pizza = new();
50+
return result;
51+
}
52+
}
53+
54+
public class PizzaDirector
55+
{
56+
private readonly IPizzaBuilder builder;
57+
58+
public PizzaDirector(IPizzaBuilder builder) => this.builder = builder;
59+
60+
public void BuildMargherita()
61+
{
62+
builder.SetSize("Medium");
63+
builder.SetCrust("Thin");
64+
builder.AddTopping("Tomato");
65+
builder.AddTopping("Cheese");
66+
builder.AddTopping("Basil");
67+
}
68+
69+
public void BuildPepperoni()
70+
{
71+
builder.SetSize("Large");
72+
builder.SetCrust("Regular");
73+
builder.AddTopping("Pepperoni");
74+
builder.AddTopping("Cheese");
75+
builder.AddTopping("Olives");
76+
}
77+
}
Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,80 @@
11
@page "/builder"
22
@rendermode InteractiveServer
3+
@using DesignPatterns.Creational.PatternBuilder
34

4-
<h3>Builder</h3>
5+
<h3>Builder Pattern Demo - Pizza Builder</h3>
6+
7+
<p>Choose your pizza options and see the resulting pizza summary.</p>
8+
9+
<div class="card p-3">
10+
<div class="mb-3">
11+
<label class="form-label">Select Pizza Type:</label>
12+
<select class="form-select" @bind="SelectedBuilderType">
13+
<option value="veggie">Veggie Pizza</option>
14+
<option value="meat">Meat Pizza</option>
15+
</select>
16+
</div>
17+
18+
<div class="mb-3">
19+
<label class="form-label">Size:</label>
20+
<select class="form-select" @bind="SelectedSize">
21+
<option>Small</option>
22+
<option>Medium</option>
23+
<option>Large</option>
24+
</select>
25+
</div>
26+
27+
<div class="mb-3">
28+
<label class="form-label">Crust:</label>
29+
<select class="form-select" @bind="SelectedCrust">
30+
<option>Regular</option>
31+
<option>Thin</option>
32+
<option>Cheese Stuffed</option>
33+
</select>
34+
</div>
35+
36+
<div class="mb-3">
37+
<label class="form-label">Toppings:</label>
38+
<input type="text" class="form-control" placeholder="Comma separated toppings" @bind="ToppingsInput" />
39+
</div>
40+
41+
<button class="btn btn-primary" @onclick="BuildPizza">Build Pizza</button>
42+
43+
@if (BuiltPizza != null)
44+
{
45+
<div class="alert alert-success mt-3">
46+
<h5>Pizza Summary:</h5>
47+
<p>@BuiltPizza</p>
48+
</div>
49+
}
50+
</div>
551

652
@code {
53+
private string SelectedBuilderType = "veggie";
54+
private string SelectedSize = "Medium";
55+
private string SelectedCrust = "Regular";
56+
private string ToppingsInput = "";
57+
private Pizza? BuiltPizza;
58+
59+
private void BuildPizza()
60+
{
61+
IPizzaBuilder builder = SelectedBuilderType switch
62+
{
63+
"meat" => new MeatPizzaBuilder(),
64+
_ => new VeggiePizzaBuilder()
65+
};
66+
67+
builder.SetSize(SelectedSize);
68+
builder.SetCrust(SelectedCrust);
69+
70+
if (!string.IsNullOrWhiteSpace(ToppingsInput))
71+
{
72+
foreach (var topping in ToppingsInput.Split(',', StringSplitOptions.TrimEntries))
73+
{
74+
builder.AddTopping(topping);
75+
}
76+
}
777

78+
BuiltPizza = builder.Build();
79+
}
880
}

0 commit comments

Comments
 (0)