Skip to content

Commit 4304dac

Browse files
committed
Add Factory Method Pattern
1 parent ed95e03 commit 4304dac

File tree

5 files changed

+194
-1
lines changed

5 files changed

+194
-1
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
namespace FactoryMethod
2+
{
3+
/// <summary>
4+
/// Product
5+
/// </summary>
6+
public abstract class Burger
7+
{
8+
public int ProductId { get; set; }
9+
10+
public abstract void Prepare();
11+
}
12+
13+
/// <summary>
14+
/// Concreate Product A
15+
/// </summary>
16+
public class BeefBurger : Burger
17+
{
18+
public bool Angus { get; set; }
19+
20+
public override void Prepare()
21+
{
22+
Console.WriteLine("Preparing Beef Burger");
23+
}
24+
}
25+
26+
/// <summary>
27+
/// Concreate Product B
28+
/// </summary>
29+
public class VeggieBurger : Burger
30+
{
31+
public bool Combo { get; set; }
32+
33+
public override void Prepare()
34+
{
35+
Console.WriteLine("Preparing Veggie Burger");
36+
}
37+
}
38+
39+
/// <summary>
40+
/// Creator
41+
/// </summary>
42+
public abstract class Restaurant
43+
{
44+
public Burger OrderBurger()
45+
{
46+
Burger burger = CreateBurger();
47+
burger.Prepare();
48+
return burger;
49+
}
50+
51+
public abstract Burger CreateBurger();
52+
}
53+
54+
/// <summary>
55+
/// Concreate Creator A
56+
/// </summary>
57+
public class BeefBurgerRestaurant : Restaurant
58+
{
59+
public override Burger CreateBurger()
60+
{
61+
return new BeefBurger();
62+
}
63+
}
64+
65+
/// <summary>
66+
/// Concreate Creator B
67+
/// </summary>
68+
public class VeggieBurgerRestaurant : Restaurant
69+
{
70+
public override Burger CreateBurger()
71+
{
72+
return new VeggieBurger();
73+
}
74+
}
75+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
namespace FactoryMethod
2+
{
3+
public abstract class DiscountService
4+
{
5+
public abstract int DiscountPercentage { get; }
6+
7+
public override string ToString() => GetType().Name;
8+
}
9+
10+
public class CountryDiscountService : DiscountService
11+
{
12+
private readonly string _countryIdentifier;
13+
14+
public CountryDiscountService(string countryIdentifier)
15+
{
16+
_countryIdentifier = countryIdentifier;
17+
}
18+
19+
public override int DiscountPercentage
20+
{
21+
get
22+
{
23+
switch (_countryIdentifier)
24+
{
25+
case "USA":
26+
return 10;
27+
case "UK":
28+
return 15;
29+
case "GER":
30+
return 20;
31+
default:
32+
return 0; // No discount for other countries
33+
}
34+
}
35+
}
36+
}
37+
38+
public class CodeDiscountService : DiscountService
39+
{
40+
private readonly Guid _code;
41+
42+
public CodeDiscountService(Guid code)
43+
{
44+
_code = code;
45+
}
46+
47+
public override int DiscountPercentage
48+
{
49+
get => 10;
50+
}
51+
}
52+
53+
public abstract class DiscountFactory
54+
{
55+
public abstract DiscountService CreateDiscountService();
56+
}
57+
58+
public class CountryDiscountFactory : DiscountFactory
59+
{
60+
public readonly string _countryIdentifier;
61+
62+
public CountryDiscountFactory(string countryIdentifier)
63+
{
64+
_countryIdentifier = countryIdentifier;
65+
}
66+
67+
public override DiscountService CreateDiscountService()
68+
{
69+
return new CountryDiscountService(_countryIdentifier);
70+
}
71+
}
72+
73+
public class CodeDiscountFactory : DiscountFactory
74+
{
75+
public readonly Guid _code;
76+
77+
public CodeDiscountFactory(Guid code)
78+
{
79+
_code = code;
80+
}
81+
82+
public override DiscountService CreateDiscountService()
83+
{
84+
return new CodeDiscountService(_code);
85+
}
86+
}
87+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net8.0</TargetFramework>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<Nullable>enable</Nullable>
8+
</PropertyGroup>
9+
10+
</Project>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using FactoryMethod;
2+
3+
Restaurant beefBurgerFactory = new BeefBurgerRestaurant();
4+
Burger beefBurger = beefBurgerFactory.OrderBurger();
5+
6+
Restaurant veggieBurgerFactory = new VeggieBurgerRestaurant();
7+
Burger veggieBurger = veggieBurgerFactory.OrderBurger();
8+
9+
var factories = new List<DiscountFactory>
10+
{
11+
new CodeDiscountFactory(Guid.NewGuid()),
12+
new CountryDiscountFactory("GER")
13+
};
14+
15+
foreach (var factory in factories)
16+
{
17+
var discountService = factory.CreateDiscountService();
18+
Console.WriteLine(
19+
$"Percentage {discountService.DiscountPercentage} " + $"coming from {discountService}"
20+
);
21+
}

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ namespace Singleton
118118

119119
```
120120

121-
### 2. Factory Pattern
121+
### 2. Factory Method Pattern
122122

123123
### 3. Abstract Factory Pattern
124124

0 commit comments

Comments
 (0)