-
Notifications
You must be signed in to change notification settings - Fork 31
/
FactoryMethod.cs
86 lines (77 loc) · 2.03 KB
/
FactoryMethod.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
namespace DesignPatterns.Creational;
public class FactoryMethod
{
[Fact]
public void Execute()
{
ICarFactory carFactory = new AudiCarFactory();
Car car = carFactory.CreateCar();
Assert.Equal("Audi", car.Make);
carFactory = new MazdaCarFactory();
car = carFactory.CreateCar();
Assert.Equal("Mazda", car.Make);
}
/// <summary>
/// Product
/// </summary>
/// <remarks>
/// Defines the interface of objects the factory method creates.
/// </remarks>
public abstract class Car
{
public abstract string Make { get; }
}
/// <summary>
/// Creator
/// </summary>
/// <remarks>
/// - Declares the factory method, which returns an object of type Product.
/// - Creator may also define a default implementation of the factory method that returns a default Concrete Product
/// object.
/// </remarks>
public interface ICarFactory
{
// Factory Method
Car CreateCar();
}
/// <summary>
/// Concrete Product
/// </summary>
/// <remarks>
/// Implements the Product interface.
/// </remarks>
public class MazdaCar : Car
{
public override string Make => "Mazda";
}
/// <summary>
/// Concrete Creator
/// </summary>
/// <remarks>
/// Overrides the factory method to return an instance of a ConcreteProduct.
/// </remarks>
public class MazdaCarFactory : ICarFactory
{
public Car CreateCar() => new MazdaCar();
}
/// <summary>
/// Concrete Product
/// </summary>
/// <remarks>
/// Implements the Product interface.
/// </remarks>
public class AudiCar : Car
{
public override string Make => "Audi";
}
/// <summary>
/// Concrete Creator
/// </summary>
/// <remarks>
/// Overrides the factory method to return an instance of a ConcreteProduct.
/// </remarks>
public class AudiCarFactory : ICarFactory
{
public Car CreateCar() => new AudiCar();
}
}