抽象工厂
名称 | Abstract Factory |
结构 | ![]() |
意图 | 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 |
适用性 |
|
1
// Abstract Factory
2![](/Images/OutliningIndicators/None.gif)
3
// Intent: "Provide an interface for creating families of related or
4
// dependent objects without specifying their concrete classes".
5![](/Images/OutliningIndicators/None.gif)
6
// For further information, read "Design Patterns", p87, Gamma et al.,
7
// Addison-Wesley, ISBN:0-201-63361-2
8![](/Images/OutliningIndicators/None.gif)
9
/* Notes:
10
* When the construction needed involves many objects, possible organised
11
* in multi-faceted arrangements, the entire construction can be delegated
12
* to an abstract factory. This exposes standardised creation functionality
13
* which can be customised in concrete implementation to suit your specific
14
* needs, and avoid embedding this information in higher level code - it
15
* just needs to know how to call the abstract factory.
16
*
17
* In this sample, we have a framework with three abstract operating classes,
18
* called DPDocument, DPWorkspace and DPView and one abstract construction
19
* class, called DPFactory. An application-level class, called DPApplication
20
* is responsible for construction.
21
*
22
* We have a series of application-level operating classes derived from this
23
* framework - MyDocument, MyWorkspace and MyView. For design reasons we
24
* assume we wish to instantiate these from inside DPApplication. As there
25
* are multiple objects needed and they could be arranged in different
26
* lattices, we use a factory, MyFactory (in our example, there are all
27
* simple siblings), which is called inside DPApplication.
28
*
29
*/
30
31
namespace AbstractFactory_DesignPattern
32
{
33
using System;
34![](/Images/OutliningIndicators/InBlock.gif)
35
// These classes could be part of a framework,
36
// which we will call DP
37
// ===========================================
38
39
abstract class DPDocument
40
{
41
abstract public void Dump();
42
}
43![](/Images/OutliningIndicators/InBlock.gif)
44
abstract class DPWorkspace
45
{
46
abstract public void Dump();
47
}
48
49
abstract class DPView
50
{
51
abstract public void Dump();
52
}
53
54
abstract class DPFactory
55
{
56
abstract public DPDocument CreateDocument();
57
abstract public DPView CreateView();
58
abstract public DPWorkspace CreateWorkspace();
59
}
60![](/Images/OutliningIndicators/InBlock.gif)
61
abstract class DPApplication
62
{
63
protected DPDocument doc;
64
protected DPWorkspace workspace;
65
protected DPView view;
66
67
public void ConstructObjects(DPFactory factory)
68
{
69
// Create objects as needed
70
doc = factory.CreateDocument();
71
workspace = factory.CreateWorkspace();
72
view = factory.CreateView();
73
}
74
75
abstract public void Dump();
76![](/Images/OutliningIndicators/InBlock.gif)
77
public void DumpState()
78
{
79
if (doc != null) doc.Dump();
80
if (workspace != null) workspace.Dump();
81
if (view != null) view.Dump();
82
}
83
}
84![](/Images/OutliningIndicators/InBlock.gif)
85
// These classes could be part of an application
86
class MyApplication : DPApplication
87
{
88
MyFactory myFactory = new MyFactory();
89![](/Images/OutliningIndicators/InBlock.gif)
90
override public void Dump()
91
{
92
Console.WriteLine("MyApplication exists");
93
}
94![](/Images/OutliningIndicators/InBlock.gif)
95
public void CreateFamily()
96
{
97
MyFactory myFactory = new MyFactory();
98
ConstructObjects(myFactory);
99
}
100
}
101![](/Images/OutliningIndicators/InBlock.gif)
102
class MyDocument : DPDocument
103
{
104
public MyDocument()
105
{
106
Console.WriteLine("in MyDocument constructor");
107
}
108
109
override public void Dump()
110
{
111
Console.WriteLine("MyDocument exists");
112
}
113
}
114![](/Images/OutliningIndicators/InBlock.gif)
115
class MyWorkspace : DPWorkspace
116
{
117
override public void Dump()
118
{
119
Console.WriteLine("MyWorkspace exists");
120
}
121
}
122![](/Images/OutliningIndicators/InBlock.gif)
123
class MyView : DPView
124
{
125
override public void Dump()
126
{
127
Console.WriteLine("MyView exists");
128
}
129
}
130![](/Images/OutliningIndicators/InBlock.gif)
131
class MyFactory : DPFactory
132
{
133
override public DPDocument CreateDocument()
134
{
135
return new MyDocument();
136
}
137
override public DPWorkspace CreateWorkspace()
138
{
139
return new MyWorkspace();
140
}
141
override public DPView CreateView()
142
{
143
return new MyView();
144
}
145
}
146![](/Images/OutliningIndicators/InBlock.gif)
147
/// <summary>
148
/// Summary description for Client.
149
/// </summary>
150
public class Client
151
{
152
public static int Main(string[] args)
153
{
154
MyApplication myApplication = new MyApplication();
155![](/Images/OutliningIndicators/InBlock.gif)
156
myApplication.CreateFamily();
157![](/Images/OutliningIndicators/InBlock.gif)
158
myApplication.DumpState();
159
160
return 0;
161
}
162
}
163
}
164![](/Images/OutliningIndicators/None.gif)
165![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
30
![](/Images/OutliningIndicators/None.gif)
31
![](/Images/OutliningIndicators/None.gif)
32
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/InBlock.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/InBlock.gif)
73
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/InBlock.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
79
![](/Images/OutliningIndicators/InBlock.gif)
80
![](/Images/OutliningIndicators/InBlock.gif)
81
![](/Images/OutliningIndicators/InBlock.gif)
82
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
83
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
84
![](/Images/OutliningIndicators/InBlock.gif)
85
![](/Images/OutliningIndicators/InBlock.gif)
86
![](/Images/OutliningIndicators/InBlock.gif)
87
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
88
![](/Images/OutliningIndicators/InBlock.gif)
89
![](/Images/OutliningIndicators/InBlock.gif)
90
![](/Images/OutliningIndicators/InBlock.gif)
91
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
92
![](/Images/OutliningIndicators/InBlock.gif)
93
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
94
![](/Images/OutliningIndicators/InBlock.gif)
95
![](/Images/OutliningIndicators/InBlock.gif)
96
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
97
![](/Images/OutliningIndicators/InBlock.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
100
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
101
![](/Images/OutliningIndicators/InBlock.gif)
102
![](/Images/OutliningIndicators/InBlock.gif)
103
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
104
![](/Images/OutliningIndicators/InBlock.gif)
105
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
106
![](/Images/OutliningIndicators/InBlock.gif)
107
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
108
![](/Images/OutliningIndicators/InBlock.gif)
109
![](/Images/OutliningIndicators/InBlock.gif)
110
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
111
![](/Images/OutliningIndicators/InBlock.gif)
112
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
113
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
114
![](/Images/OutliningIndicators/InBlock.gif)
115
![](/Images/OutliningIndicators/InBlock.gif)
116
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
117
![](/Images/OutliningIndicators/InBlock.gif)
118
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
119
![](/Images/OutliningIndicators/InBlock.gif)
120
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
121
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
122
![](/Images/OutliningIndicators/InBlock.gif)
123
![](/Images/OutliningIndicators/InBlock.gif)
124
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
125
![](/Images/OutliningIndicators/InBlock.gif)
126
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
127
![](/Images/OutliningIndicators/InBlock.gif)
128
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
129
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
130
![](/Images/OutliningIndicators/InBlock.gif)
131
![](/Images/OutliningIndicators/InBlock.gif)
132
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
133
![](/Images/OutliningIndicators/InBlock.gif)
134
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
135
![](/Images/OutliningIndicators/InBlock.gif)
136
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
137
![](/Images/OutliningIndicators/InBlock.gif)
138
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
139
![](/Images/OutliningIndicators/InBlock.gif)
140
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
141
![](/Images/OutliningIndicators/InBlock.gif)
142
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
143
![](/Images/OutliningIndicators/InBlock.gif)
144
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
145
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
146
![](/Images/OutliningIndicators/InBlock.gif)
147
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
148
![](/Images/OutliningIndicators/InBlock.gif)
149
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
150
![](/Images/OutliningIndicators/InBlock.gif)
151
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
152
![](/Images/OutliningIndicators/InBlock.gif)
153
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
154
![](/Images/OutliningIndicators/InBlock.gif)
155
![](/Images/OutliningIndicators/InBlock.gif)
156
![](/Images/OutliningIndicators/InBlock.gif)
157
![](/Images/OutliningIndicators/InBlock.gif)
158
![](/Images/OutliningIndicators/InBlock.gif)
159
![](/Images/OutliningIndicators/InBlock.gif)
160
![](/Images/OutliningIndicators/InBlock.gif)
161
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
162
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
163
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
164
![](/Images/OutliningIndicators/None.gif)
165
![](/Images/OutliningIndicators/None.gif)