-
Notifications
You must be signed in to change notification settings - Fork 33
Expand file tree
/
Copy pathDeliveryFactory.cs
More file actions
147 lines (129 loc) · 3.29 KB
/
DeliveryFactory.cs
File metadata and controls
147 lines (129 loc) · 3.29 KB
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
namespace Examples.Jalilpour
{
public enum CargoType
{
Air,
Ship,
Train
}
public class DeliveryService
{
public Delivery Create(CargoType cargoType)
{
if (cargoType == CargoType.Air)
{
return new AirDeliveryFactory().CreateDelivery();
}
else if (cargoType == CargoType.Ship)
{
return new ShipDeliveryFactory().CreateDelivery();
}
else if (cargoType == CargoType.Train)
{
return new TrainDeliveryFactory().CreateDelivery();
}
throw new InvalidOperationException();
}
}
public abstract class Delivery
{
public abstract void DeliverCargo();
}
public class AirDelivery : Delivery
{
public override void DeliverCargo()
{
throw new NotImplementedException();
}
}
public class TrainDelivery : Delivery
{
public override void DeliverCargo()
{
throw new NotImplementedException();
}
}
public class ShipDelivery : Delivery
{
public ShipDelivery()
{
}
public ShipDelivery(string origin, string destination)
{
}
public override void DeliverCargo()
{
throw new NotImplementedException();
}
}
public abstract class DeliveryFactory
{
public abstract Delivery CreateDelivery();
}
public class AirDeliveryFactory : DeliveryFactory
{
private static AirDelivery airDelivery;
public override Delivery CreateDelivery()
{
if (airDelivery == null)
airDelivery = new AirDelivery();
return airDelivery;
}
}
public class ShipDeliveryFactory : DeliveryFactory
{
public override Delivery CreateDelivery()
{
return new ShipDelivery("BandarAbbas", "Astarakhan");
}
}
public class TrainDeliveryFactory : DeliveryFactory
{
private static bool hasAlreadyInstance;
public override Delivery CreateDelivery()
{
if (hasAlreadyInstance)
{
init();
return new TrainDelivery();
}
else
{
hasAlreadyInstance = true;
return new TrainDelivery();
}
}
private void init()
{
throw new NotImplementedException();
}
}
/// <summary>
/// Imagine it is a library and we make it as a package. so users or customers,
/// can't change your code, but they want to add a new behavior like Truck. so, how you can solve it.
/// </summary>
public class Truck : Delivery
{
public override void DeliverCargo()
{
Console.WriteLine("Delivering...");
}
}
public static class DeliveryFactoryExtentionMethod
{
public static void DeliverCargoByTruck(this Delivery truck)
{
throw new NotImplementedException();
}
}
///
public class Program()
{
public void main()
{
Truck truck = new();
truck.DeliverCargoByTruck();
}
}
}