Skip to content

Commit b23723a

Browse files
committed
Add Builder pattern
1 parent e9fccc3 commit b23723a

File tree

11 files changed

+176
-11
lines changed

11 files changed

+176
-11
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
namespace CreationalPatterns.Builder;
2+
3+
public class AmericanPizzaBuilder : PizzaBuilder
4+
{
5+
public override void BuildDough()
6+
{
7+
Pizza.Dough = "pan baked";
8+
}
9+
10+
public override void BuildSauce()
11+
{
12+
Pizza.Sauce = "hot spicy";
13+
}
14+
15+
public override void BuildTopping(string topping = "")
16+
{
17+
Pizza.Topping = topping;
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
namespace CreationalPatterns.Builder;
2+
3+
public class ItalianPizzaBuilder : PizzaBuilder
4+
{
5+
public override void BuildDough()
6+
{
7+
Pizza.Dough = "crispy thin";
8+
}
9+
10+
public override void BuildSauce()
11+
{
12+
Pizza.Sauce = "mild";
13+
}
14+
15+
public override void BuildTopping(string topping = "")
16+
{
17+
Pizza.Topping = topping;
18+
}
19+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace CreationalPatterns.Builder;
2+
3+
public class Pizza
4+
{
5+
public string Dough { get; set; }
6+
7+
public string Sauce { get; set; }
8+
9+
public string Topping { get; set; }
10+
11+
public override string ToString()
12+
{
13+
return $"{Dough}+{Sauce}+{Topping}";
14+
}
15+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace CreationalPatterns.Builder;
2+
3+
public abstract class PizzaBuilder
4+
{
5+
protected readonly Pizza Pizza;
6+
7+
public PizzaBuilder()
8+
{
9+
Pizza = new Pizza();
10+
}
11+
12+
public abstract void BuildDough();
13+
public abstract void BuildSauce();
14+
public abstract void BuildTopping(string topping = "");
15+
16+
public Pizza Build()
17+
{
18+
return Pizza;
19+
}
20+
}

CreationalPatterns/Builder/README.md

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Creating and assembling the parts of a complex object within a class is inflexib
1919

2020
A class can delegate to different `Builder` objects to create different representations of a complex object.
2121

22-
![Real world example](https://sourcemaking.com/files/v2/content/patterns/Builder_example1.svg)
22+
![Real world example](https://sourcemaking.com/files/v2/content/patterns/Builder_example1.png)
2323

2424
*Source*: SourceMaking.com
2525

@@ -67,10 +67,21 @@ A class can delegate to different `Builder` objects to create different represen
6767

6868
## Example
6969

70-
**Definition**
70+
![PizzaBuilder](/Diagrams/Builder.png)
7171

7272
**Usage**
7373

74+
```cs
75+
// Create a concrete builder
76+
var americanPizzaBuilder = new AmericanPizzaBuilder();
77+
78+
// Create a director
79+
var waiter = new Waiter(americanPizzaBuilder);
80+
81+
// Create a pizza
82+
var pizza = waiter.CreatePizza("Spinach+Olives");
83+
```
84+
7485
## Comparison with other patterns
7586

7687
* Builders can produce products that do not belong to the same class hierarchy or interface. It is a key difference between the `Builder` and other creational patterns.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
3+
namespace CreationalPatterns.Builder;
4+
5+
public class TestBuilder
6+
{
7+
public static void run()
8+
{
9+
var americanPizzaBuilder = new AmericanPizzaBuilder();
10+
var waiter = new Waiter(americanPizzaBuilder);
11+
12+
var pizza = waiter.CreatePizza("Spinach+Olives");
13+
14+
Console.WriteLine("Created Pizza: "+ pizza);
15+
}
16+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace CreationalPatterns.Builder;
2+
3+
// Director
4+
public class Waiter
5+
{
6+
private PizzaBuilder _pizzaBuilder;
7+
8+
public Waiter(PizzaBuilder pizzaBuilder)
9+
{
10+
_pizzaBuilder = pizzaBuilder;
11+
}
12+
13+
public Pizza CreatePizza(string topping)
14+
{
15+
_pizzaBuilder.BuildDough();
16+
_pizzaBuilder.BuildSauce();
17+
_pizzaBuilder.BuildTopping(topping);
18+
return _pizzaBuilder.Build();
19+
}
20+
}

CreationalPatterns/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class Program
1111
{
1212
static void Main(string[] args)
1313
{
14-
Prototype.TestPrototype.Run();
14+
Builder.TestBuilder.run();
1515
}
1616
}
1717
}

CreationalPatterns/doc/Builder.cd

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<ClassDiagram MajorVersion="1" MinorVersion="1">
3+
<Class Name="CreationalPatterns.Builder.AmericanPizzaBuilder">
4+
<Position X="9" Y="5.25" Width="1.5" />
5+
<TypeIdentifier>
6+
<HashCode>AAAAAAAAAgAAAAAAAAAQAAAAAIAAAAAAAAAAAAAAAAA=</HashCode>
7+
<FileName>Builder\AmericanPizzaBuilder.cs</FileName>
8+
</TypeIdentifier>
9+
</Class>
10+
<Class Name="CreationalPatterns.Builder.ItalianPizzaBuilder">
11+
<Position X="11.25" Y="5.25" Width="1.5" />
12+
<TypeIdentifier>
13+
<HashCode>AAAAAAAAAgAAAAAAAAAQAAAAAIAAAAAAAAAAAAAAAAA=</HashCode>
14+
<FileName>Builder\ItalianPizzaBuilder.cs</FileName>
15+
</TypeIdentifier>
16+
</Class>
17+
<Class Name="CreationalPatterns.Builder.Pizza">
18+
<Position X="6.25" Y="2.5" Width="1.5" />
19+
<TypeIdentifier>
20+
<HashCode>AAgAAEAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAQA=</HashCode>
21+
<FileName>Builder\Pizza.cs</FileName>
22+
</TypeIdentifier>
23+
</Class>
24+
<Class Name="CreationalPatterns.Builder.PizzaBuilder">
25+
<Position X="10.25" Y="1.75" Width="1.5" />
26+
<TypeIdentifier>
27+
<HashCode>AAAAAAAAAgAAAAAAAAAQAAAAAIAAgAEAAAAAAAAAAAA=</HashCode>
28+
<FileName>Builder\PizzaBuilder.cs</FileName>
29+
</TypeIdentifier>
30+
<ShowAsAssociation>
31+
<Field Name="Pizza" />
32+
</ShowAsAssociation>
33+
</Class>
34+
<Class Name="CreationalPatterns.Builder.Waiter">
35+
<Position X="14.25" Y="2.5" Width="1.5" />
36+
<TypeIdentifier>
37+
<HashCode>AAAAAAAAAAAAAAAAEEAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
38+
<FileName>Builder\Waiter.cs</FileName>
39+
</TypeIdentifier>
40+
<ShowAsAssociation>
41+
<Field Name="_pizzaBuilder" />
42+
</ShowAsAssociation>
43+
</Class>
44+
<Font Name="Segoe UI" Size="9" />
45+
</ClassDiagram>

Diagrams/Builder.png

31.9 KB
Loading

0 commit comments

Comments
 (0)