Abstract Factory

在面向对象的程序语言中,我们经常听到设计模式这个名词,其实呢,大部分设计模式我们在写项目的过程中都或多或少的用到了, 例如 Template, Strategy, Adapter, Proxy, Builder等等,只是可能我们不知道它被称呼为这个名字。
虽然设计模式的类型繁多, 但是有些是比较经典的(可能让人第一次见就觉得醒醐灌顶吧。),
例如Singleton, Abstract Factory, Observer, Visitor等。

Singleton和ObServer在项目中应该都是遍地的,Visitor其实本质是函数式语言中的”模式匹配”,
这里就写篇关于Abstract Factory在游戏中的一个应用。

在游戏中,我们经常需要创建各类怪物,角色,宠物,陷阱等等。
如若需要根据副本类型优雅的创建各类怪物,并且尽量的降低耦合度,用Abstract Factory 模式是一个很好的选择, 下面贴下我写的代码。(也是Abstract Factory在游戏中的一种使用方式, 代码里面在创建相应的类型对象的时候使用了SimpleFactory模式.)

最后,说下个人观点
关于设计模式在程序中应用,也要把握适当才行,如果你觉得你的代码是直接的,精巧的,简单的,那么就是最好的,如果在写代码的时候过分在意设计模式,可能会让本身应该简洁的代码绕了几个弯哦~

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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public enum OBJ_TYPE{
MON = 1,
PET = 2,
PLAYER = 3
}

public enum MON_TYPE{
NORMAL = 1,
LEGEND = 2
}

public enum PET_TYPE{
NORMAL = 1,
LEGEND = 2
}

public enum PLAYER_TYPE{
NORMAL = 1,
LEGEND = 2
}

abstract class Ab_ObjFactory{
public abstract List<Ab_Obj> Create();
}

abstract class Ab_Obj{

public abstract void Init();

protected OBJ_TYPE _type = 0;
public abstract OBJ_TYPE Type {
get;
set;
}

public static T Create<T>() where T : Ab_Obj, new(){
T t = new T ();
return t;
}

}

abstract class Ab_ObjMon : Ab_Obj{
public override OBJ_TYPE Type{
get{
return OBJ_TYPE.MON;
}
set{
_type = OBJ_TYPE.MON;
}
}

protected MON_TYPE _subType;
public abstract MON_TYPE SubType{
get;
set;
}
}

abstract class Ab_ObjPet : Ab_Obj{
public override OBJ_TYPE Type{
get{
return OBJ_TYPE.PET;
}
set{
_type = OBJ_TYPE.PET;
}
}

protected PET_TYPE _subType;
public abstract PET_TYPE SubType{
get;
set;
}


}

abstract class Ab_ObjPlayer : Ab_Obj{
public override OBJ_TYPE Type{
get{
return OBJ_TYPE.PLAYER;
}
set{
_type = OBJ_TYPE.PLAYER;
}
}

protected PLAYER_TYPE _subType;
public abstract PLAYER_TYPE SubType{
get;
set;
}
}


class ObjNormalMon : Ab_ObjMon{
public override MON_TYPE SubType{
get{
return MON_TYPE.NORMAL;
}
set{
_subType = MON_TYPE.NORMAL;
}
}
public override void Init(){
Debug.Log("创建对象 NormalMon");
}

}

class ObjLegendMon : Ab_ObjMon{
public override MON_TYPE SubType{
get{
return MON_TYPE.LEGEND;
}
set{
_subType = MON_TYPE.LEGEND;
}
}
public override void Init(){
Debug.Log ("创建对象 LegendMon");
}
}

class ObjNormalPet : Ab_ObjPet{
public override PET_TYPE SubType{
get{
return PET_TYPE.NORMAL;
}
set{
_subType = PET_TYPE.NORMAL;
}
}
public override void Init(){
Debug.Log("创建对象 NormalPet");
}
}

class ObjLegendPet : Ab_ObjPet{
public override PET_TYPE SubType{
get{
return PET_TYPE.LEGEND;
}
set{
_subType = PET_TYPE.LEGEND;
}
}

public override void Init(){
Debug.Log("创建对象 LegendPet");
}
}

class ObjNormalPlayer : Ab_ObjPlayer{
public override PLAYER_TYPE SubType{
get{
return PLAYER_TYPE.NORMAL;
}
set{
_subType = PLAYER_TYPE.NORMAL;
}
}

public override void Init(){
Debug.Log("创建对象 NormalPlayer");
}
}

class ObjLegendPlayer : Ab_ObjPlayer{
public override PLAYER_TYPE SubType{
get{
return PLAYER_TYPE.LEGEND;
}
set{
_subType = PLAYER_TYPE.LEGEND;
}
}

public override void Init(){
Debug.Log ("创建对象 LegendPlayer");
}
}


class DungeonAFactory : Ab_ObjFactory{
public override List<Ab_Obj> Create(){
List<Ab_Obj> objList = new List<Ab_Obj> ();
objList.AddRange( CreateMon ());
objList.AddRange( CreatePet ());
return objList;
}

public List<Ab_Obj> CreateMon(){
List<Ab_Obj> objList = new List<Ab_Obj> ();
ObjNormalMon normalMon = Ab_Obj.Create<ObjNormalMon> ();
normalMon.Init ();
objList.Add (normalMon);
ObjLegendMon legendMon = Ab_Obj.Create<ObjLegendMon> ();
legendMon.Init ();
objList.Add (legendMon);
return objList;
}

public List<Ab_Obj> CreatePet(){
List<Ab_Obj> objList = new List<Ab_Obj> ();
ObjNormalPet normalPet = Ab_Obj.Create<ObjNormalPet>();
normalPet.Init ();
objList.Add (normalPet);
ObjLegendPet legendPet = Ab_Obj.Create<ObjLegendPet> ();
legendPet.Init ();
objList.Add (legendPet);
return objList;
}
}

class DungeonBFactory : Ab_ObjFactory{
public override List<Ab_Obj> Create(){
List<Ab_Obj> objList = new List<Ab_Obj> ();
objList.AddRange( CreateMon ());
objList.AddRange( CreatePet ());
return objList;
}

public List<Ab_Obj> CreateMon(){
List<Ab_Obj> objList = new List<Ab_Obj> ();
ObjLegendMon legendAMon = Ab_Obj.Create<ObjLegendMon> ();
legendAMon.Init ();
objList.Add (legendAMon);
ObjLegendMon legendBMon = Ab_Obj.Create<ObjLegendMon> ();
legendBMon.Init ();
objList.Add (legendBMon);
return objList;
}

public List<Ab_Obj> CreatePet(){
List<Ab_Obj> objList = new List<Ab_Obj> ();
ObjLegendPet legendAPet = Ab_Obj.Create<ObjLegendPet> ();
legendAPet.Init ();
objList.Add (legendAPet);
ObjLegendPet legendBPet = Ab_Obj.Create<ObjLegendPet> ();
legendBPet.Init ();
objList.Add (legendBPet);
return objList;
}
}

class ArenaFactory : Ab_ObjFactory{

public override List<Ab_Obj> Create(){
List<Ab_Obj> objList = new List<Ab_Obj> ();
objList.AddRange( CreatePlayer ());
return objList;
}

public List<Ab_Obj> CreatePlayer(){
List<Ab_Obj> objList = new List<Ab_Obj> ();
ObjNormalPlayer normalAPet = Ab_Obj.Create<ObjNormalPlayer> ();
normalAPet.Init ();
objList.Add (normalAPet);
ObjLegendPlayer legendBPet = Ab_Obj.Create<ObjLegendPlayer> ();
legendBPet.Init ();
objList.Add (legendBPet);
return objList;
}
}

public class main : MonoBehaviour {

void Awake() {
DungeonAFactory normalMonFactory = new DungeonAFactory();
DungeonBFactory normalPetFactory = new DungeonBFactory();
ArenaFactory arenaFactory = new ArenaFactory ();
normalMonFactory.Create ();
normalPetFactory.Create ();
arenaFactory.Create ();
}

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}




}

用c#写的,在Unity里面挂上脚本贴入代码可以看到效果。