@@ -36,10 +36,10 @@ Progressing
36
36
37
37
### 真实的例子
38
38
一个工厂方法模式现实中的使用是用在塑料玩具厂。底模粉用于制造塑料玩具是相同的,但不同的外形可以使用不同的塑料模具生产它。这就像有一个工厂模式它有一个可以输入我们想要的外形名称的地方,而且输出是我们所要求的塑料外形。玩具制造的例子如下图表所示。
39
- ###软件例子
39
+ ### 软件例子
40
40
Django框架使用工厂方法模式创建一个表单的字段。Django的forms模块支持创建不同的种类的字段(CharField, EmailField)和自定义的参数(max_length, required)。
41
41
42
- ###使用案例
42
+ ### 使用案例
43
43
如果你意识到你不能够追踪应用的对象创建,那是因为这些代码被写在很多地方而不是一个单独的函数或者方法,你就应该考虑使用那个工厂方法模式。工厂方法使一个对象的创建集中化,追踪对象也变得非常简单。注意,它是完完全全可以创建不止一个工厂方法的。逻辑上,每一个工厂方法组的对象创建都是相似的。例如,一个工厂方法可以负责连接不同的数据库(MySQL, SQLite),另外一个工厂方法可以负责创建你所请求的几何对象(圆形,三角形),等等。
44
44
45
45
工厂方法在你想要从对象使用中分离对象创建时也是大有裨益的。我们在创建一个对象时不合并或者绑定到一个指定的类,通过调用一个函数我们只提供我们所想要的部分信息。这意味着将改变引入到函数很简单而且不要求任何对所使用代码的改变。
@@ -69,7 +69,7 @@ Django框架使用工厂方法模式创建一个表单的字段。Django的forms
69
69
70
70
注意,如果你执行文件所见到的地址和我所见到不相同,那是因为它们依赖当前内存布局和分配。但是结果必须是一样:两个地址应该是不一样的。如果你在Python的读取-求职-打印 循环(REPL)(交互提示环境)中写和执行代码会有异常发生,但是针对REPL的优化是通常不可能有的。
71
71
72
- ###实现
72
+ ### 实现
73
73
数据表现有很多形式。存储和重取数据有两种主要的文件类型:人类可读的文件和二进制文件。人类可读的文件例子有XML,Atom,YAML和JSON。二进制文件的例子有被SQLite所使用的 .sq3 文件格式,用于听音乐的 .mp3 文件格式。
74
74
75
75
这个例子中,我们会关注两个流行的人类可读格式:XML和JSON。尽管,人类可读文件通常解析较慢于二进制文件,但是它们让数据交换,检查,和修改变得非常容易。因此,建议选择使用人类可读文件,除非有其他的限制让你不允许你这样做(主要地是难以接收的性能和专有的二进制格式)。
@@ -257,18 +257,18 @@ connection_factory()函数是一个工厂方法。它基于输入文件的扩展
257
257
******
258
258
抽象工厂设计模式是工厂模式的归纳。基本上,抽象工厂是一组(逻辑上的)工厂方法,这里每个工厂模式都负责生成一种不同的对象。
259
259
260
- # ##一个真实的例子
260
+ # ## 一个真实的例子
261
261
抽象工厂用在车辆织造中。相同的机械装置用来冲压不同的车辆模型的部件(门,面板,车身罩体,挡泥板,以及各种镜子)。聚合了不同机械装置的模型是可配置的,而且在任何时候都可以轻松变更。在下图中我们可以看到一个车辆制造的抽象工厂的例子。
262
262
263
- # ##一个软件例子
263
+ # ## 一个软件例子
264
264
** django_factory** 包是一个为了在测试中创建Django模型的抽象工厂实现。它用来创建支持指定测试属性的模型实例。这是很重要的因为测试变得可读,以及避免共享不必要的代码。
265
265
266
- # #使用案例
266
+ # # 使用案例
267
267
因为抽象工模式是工厂方法模式的归纳,它具有同样的优点:使得追踪一个对象创建更容易,它让对象的使用和创建分离开,并且给我们内存使用以及应用的性能提高的可能。
268
268
269
269
但是问题来了:我们如何知道什么时候使用工厂模式还是抽象工厂?答案是我们通常以更简单的工厂模式开始。如果我们发现应用需要很多的工厂模式,要让它变得有意义就要合并同族对象,那么我们就使用它。抽象工厂的好处站在用户的角度来看不是很明显,但是在使用工厂模式时,通过改变活动的工厂方法它给了我们修改动态的应用(运行中的)的能力。经典的例子是给予改变一个应用的外观和感觉(例如,Apple以及Windows这样的系统,等等),对于用户来说就是在应用使用时,不需要终止它,启动它。
270
270
271
- # #实现
271
+ # # 实现
272
272
为了阐明抽象工厂模式,我将再次使用我最喜爱的例子之一。想象我们正在开发一款游戏,或者我们想把一款小游戏加入到自己的应用中来娱乐用户。我们想要至少包含两个游戏,一个给小孩子玩,一个给成人玩。基于用户输入,我们要决定在运用时创建哪一个游戏。一个抽象工厂便能做到游戏的创建部分。
273
273
274
274
让我们从儿童游戏开始吧。这个游戏叫做FrogWorld。主角是一个喜欢迟昆虫的青蛙。每个主角都需要的一个响亮的名号,在运行时,我们的这个例子中名字是由用户给出的。如下所示, interact_with()方法用于描述青蛙和障碍物(例如,虫子,迷宫以及别的青蛙)的互动:
@@ -398,7 +398,7 @@ connection_factory()函数是一个工厂方法。它基于输入文件的扩展
398
398
399
399
试着扩展游戏使它更加复杂。你的思想有多远就可以走多远:更多的障碍物,更多的敌人,以及任何你喜欢的东西。
400
400
401
- # 总结
401
+ # 总结
402
402
在这一章,我们已经见过如何使用工厂模式和抽象工厂设计模式。两种模式都可以在我们需要时使用(a)追踪对象创建,(b)分离对象的使用和创建,甚至(c)改善一个应用的性能和资源使用。情形(c)并不在章节中阐明。你可以把它当作一个不错的练习。
403
403
404
404
工厂方法设计模式以一个不属于任何类的独立函数形式实现,它负责单一种类的对象(模型,接口,等等)的创建。我们看了工厂方法如何关联到玩具厂,注意到它如何被Django用来创建不同的表单字段,讨论了它的其他可能使用场合。像一个例子那样,我们实现了一个具有访问XML 和JSON 格式文件的工厂方法。
0 commit comments