-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAbstractFactory.dart
86 lines (69 loc) · 1.89 KB
/
AbstractFactory.dart
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
import 'package:design_pattern_dart/Display/Example.dart';
class AbstractFactory extends Example {
AbstractFactory([String filePath = "lib/Creational/AbstractFactory.dart"])
: super(filePath);
@override
String testRun() {
var woodenDoorFactory = WoodenDoorFactory();
var woodenDoor = woodenDoorFactory.makeDoor();
var carpenter = woodenDoorFactory.callDoorExpert();
var ironDoorFactory = IronDoorFactory();
var ironDoor = ironDoorFactory.makeDoor();
var welder = ironDoorFactory.callDoorExpert();
return """
${woodenDoor.description()}
${carpenter.description()}
${carpenter.fix()}
------
${ironDoor.description()}
${welder.description()}
${welder.fix()}
""";
}
}
// 現在有兩種門,木門跟鐵門
abstract class Door {
String description();
}
class WoodenDoor implements Door {
@override
String description() => "This is a wooden door.";
}
class IronDoor implements Door {
@override
String description() => "This is a iron door.";
}
// 所以也會有兩種工人來修門,修木門的、跟修鐵門的
abstract class DoorExpert {
String description();
String fix();
}
class Carpenter extends DoorExpert {
@override
String description() => "I am a carpenter.";
@override
String fix() => "I am fixing wooden doors.";
}
class Welder implements DoorExpert {
@override
String description() => "I am a welder.";
@override
String fix() => "I am fixing iron doors.";
}
// 創建一個工廠,將相關 class 集合起來
abstract class DoorFactory {
Door makeDoor();
DoorExpert callDoorExpert();
}
class WoodenDoorFactory implements DoorFactory {
@override
Door makeDoor() => WoodenDoor();
@override
DoorExpert callDoorExpert() => Carpenter();
}
class IronDoorFactory implements DoorFactory {
@override
Door makeDoor() => IronDoor();
@override
DoorExpert callDoorExpert() => Welder();
}