@@ -153,6 +153,117 @@ func GetInstance() *Singleton {
153
153
154
154
反模式告诉你如何从问题到达一个坏的解决方案。
155
155
156
+ ## 14 剩下的模式
157
+
158
+ ### 桥接(Bridge)
159
+
160
+ 使用桥接模式不知改变你的实现,也改变你的抽象。
161
+
162
+ ** 优缺点:**
163
+
164
+ | 优点 | 用途和缺点 |
165
+ | -------------------------------------- | -------------------------------------------------- |
166
+ | 解耦实现,不再永久绑定到接口 | 在跨多个平台的图形和窗口系统中很有用。 |
167
+ | 抽象和实现可以独立扩展 | 当你需要以不同的方式改变接口和实现时,桥接很好用。 |
168
+ | 针对“具体的抽象类”的变化,不会影响客户 | 缺点是增加了复杂度。 |
169
+
170
+ ### 生成器(Builder)
171
+
172
+ 使用生成器模式来封装一个产品的构造过程,并允许按步骤构造。
173
+
174
+ ** 优缺点:**
175
+
176
+ | 优点 | 用途和缺点 |
177
+ | ------------------------------------------------------------ | ------------------------------------------------ |
178
+ | 封装复杂对象的构造方式 | 经常被用来建造组合结构 |
179
+ | 允许对象用多个步骤构造,并且可以改变过程(和一步到位的工厂不同) | 和使用工厂相比,构造对象需要更多客户的领域知识。 |
180
+ | 向客户隐藏产品的内部表现 | |
181
+ | 产品的实现可以被替换,因为客户只看到抽象的接口 | |
182
+
183
+ ### 责任链(Chain)
184
+
185
+ 当你要把一个处理请求的机会给予多余一个的对象时,使用责任链模式。
186
+
187
+ ** 优缺点:**
188
+
189
+ | 优点 | 用途和缺点 |
190
+ | ------------------------------------------------------------ | ------------------------------------------------------------ |
191
+ | 解耦请求的发送者和接收者 | 经常用在窗体系统中,处理鼠标点击和键盘事件。 |
192
+ | 简化你的对象,因为它不需要知道链的结构以及保持对其成员的直接引用 | 并不保证请求一定会被执行;如果没有对象处理它,可能会掉到链的末尾(这可以是优点或缺点) |
193
+ | 允许你通过改变链的成员或次序,动态地添加或移除责任。 | 运行时可能会难以观察和调试 |
194
+
195
+ ### 蝇量(Flyweight)
196
+
197
+ 当某个类的一个实例可以用于提供许多虚拟实例时,使用蝇量模式。
198
+
199
+ ** 优缺点:**
200
+
201
+ | 优点 | 用途和缺点 |
202
+ | -------------------------------------- | ------------------------------------------------------------ |
203
+ | 减少运行时对象实例的树木,节省内存 | 当一个类有许多实例,而这些实例能够用一致的方法控制时,用蝇量。 |
204
+ | 把许多“虚拟”对象的状态集中放进一个地方 | 蝇量模式的一个缺点在于,一旦你实现了它,那么类的单个逻辑实例,将无法拥有和其他实例不同的独立行为。 |
205
+
206
+ ### 解释器(Interpreter)
207
+
208
+ 使用解释器模式为语言建造解释器。
209
+
210
+ ** 优缺点:**
211
+
212
+ | 优点 | 用途和缺点 |
213
+ | ------------------------------------------------------------ | ------------------------------------------------------------ |
214
+ | 将每一个语法规则表达成一个类,使得语言容易实现 | 当你需要实现一门简单的语言时,使用解释器 |
215
+ | 因为语法由类表达,你可以轻易地改变或扩展该语言 | 当你有一个单间的语法,而且简单比效率重要时,适合用解释器 |
216
+ | 通过在类结构中添加方法,可以添加解释之外的新行为,例如打印格式的美化和更复杂的程序验证。 | 用于脚本和编程语言 |
217
+ | | 当语法规则的数目很大时,这个模式可能变得笨重。在这些情况下,一个解析器/编译器的生成器可能更适合。 |
218
+
219
+ ### 中介者(Mediator)
220
+
221
+ 使用中介者模式来集中相关对象之间复杂的沟通和控制方式。
222
+
223
+ ** 优缺点:**
224
+
225
+ | 优点 | 用途和缺点 |
226
+ | ------------------------------------------------------ | ------------------------------------------------------------ |
227
+ | 通过将中介者支持的对象从系统中解耦,增加对象的复用性。 | 中介者常用于协调相关的GUI组件 |
228
+ | 通过将控制逻辑集中,简化了系统的维护。 | 中介者模式的一个缺点是,如果设计不当,中介者对象本身会变得过度复杂。 |
229
+ | 简化以减少系统中对象之间发送的消息的变化。 | |
230
+
231
+ ### 备忘录(Memento)
232
+
233
+ 当你需要让对象返回之前的某个状态时,例如,你的用户请求“撤销”,使用备忘录模式。
234
+
235
+ ** 优缺点:**
236
+
237
+ | 优点 | 用途和缺点 |
238
+ | ------------------------------------------------ | ------------------------------------------------------------ |
239
+ | 保持被保存的状态处于关键对象外面,有助于维护内聚 | 备忘录用于保持状态 |
240
+ | 保持关键对象的数据封装 | 使用备忘录的一个缺点是,保存和恢复状态可能相当耗时 |
241
+ | 提供容易实现的恢复能力 | 在Java系统中,考虑使用序列化(Serialization)来保存系统的状态。 |
242
+
243
+ ### 原型(Prototype)
244
+
245
+ 当创建给定类的实例昂贵或者复杂时,使用原型模式。
246
+
247
+ ** 优缺点:**
248
+
249
+ | 优点 | 用途和缺点 |
250
+ | ---------------------------------------- | ------------------------------------------------------------ |
251
+ | 向客户隐藏制作新实例的复杂性 | 在一个复杂的类层次中,当系统必须创建许多类型的新对象时,应该考虑原型。 |
252
+ | 提供一种选择,让客户生成类型未知的对象 | 使用原型的缺点是,对象的复制有时候相当复杂。 |
253
+ | 在某些环境下,复制对象比创建新对象更有效 | |
254
+
255
+ ### 访问者(Visitor)
256
+
257
+ 当你想要为一个对象组合增加能力,且封装不重要时,使用访问者模式。
258
+
259
+ ** 优缺点:**
260
+
261
+ | 优点 | 用途和缺点 |
262
+ | ------------------------------------------ | ------------------------------------------------ |
263
+ | 允许你添加操作到组合结构,而不改变结构本身 | 使用访问者模式时,组合类的封装被打破 |
264
+ | 添加新操作相对容易 | 因为涉及到导游的功能,因此组合结构更加难以变化。 |
265
+ | 由访问者执行的操作的代码被集中化了 | |
266
+
156
267
## 附录
157
268
158
269
1 . [ The Porland Patterns Repository] ( http://c2.com/cgi/wiki?WelcomeVisitors )
0 commit comments