设计模式之男孩女孩(四)

来源:互联网 发布:中国大数据现状与展望 编辑:程序博客网 时间:2024/05/02 18:58


【场景】
        有一天,女孩(Girl)到男孩(Boy)宿舍说晚餐我想炒菜吃。女孩(Girl)知道男孩(Boy)喜欢吃红烧茄子,所以用老家炒茄子的方法弄一盘给男孩(Boy)尝尝!叫“西红柿烧茄子”。男孩(Boy)很惊讶,因为之前他没见过女孩(Girl)煮饭,当然也不知道女孩(Girl)会不会炒菜了。只知道女孩(Girl)不喜欢干这活,后来发现是不喜欢洗碗!惊讶之余还是赶紧依据菜铺准备买菜、洗菜、切菜。一切准备好了,女孩(Girl)要开始炒了。看样子女孩(Girl)已经很久没有炒菜了,可能是因为用电磁炉,火力不好控制把。最后弄得有点焦,不过还是很好吃!男孩(Boy)还是第一次吃这个菜。当然接着男孩(Boy)也弄了两个女孩(Girl)喜欢吃的菜。他们边看电视边吃,女孩(Girl)吃完后嘴巴一擦,看着空盘,朝男孩(Boy)笑,不用说男孩(Boy)得洗碗了。(哎,谁叫现在男女比例失调呢!)

【需求】
在这个情节里面隐藏了一个东西--菜谱。在那里呢?在男孩(Boy)、女孩(Girl)的头脑里面,不是吗?无论是什
么菜还是汤,对于菜谱来说都有几个固定的组成部分:介绍说明、调料、原料、做法。然后就可以根据菜谱去做
(生成)每道菜了。现在的需求就是可以扩展以后的每道菜都可以根据菜谱生成,当然菜谱不会自己生成菜了,
哈哈。别做梦了,自己动手做。

【分析】
设计模式的一套解决方案,准确得说:应该是一定条件下、场景下的解决方案。也就是逻辑、虚拟上的东西,用实际
的例子去说明解释逻辑、虚拟的东西,必然会有一点隔阂。在这里举这个菜谱的例子未免有点牵强。但我们只要明白
原理就可以了。或许有人要问,根据前面介绍的模式我们可以用“工厂方法”或者“抽象工厂” 来实现啊。其实也
是可以的,但着重点不一样,看需求是什么了。

“工厂方法”或者“抽象工厂”着重于生成一个或多个系列的产品,他们一定有同一的接口。他们并不关心产品本身
是什么生成出来的。这就象我们去餐厅点菜,我们只要在菜单点我们想要的菜就可以了,菜自然会送到我们桌上,自然不知道那菜是什么做,只有厨师知道。

而“生成器”则是我们自己知道菜什么做,也就是有了菜谱。我们自己动手做。也就是着重于产品的组成和生成过程。
而生成出来的菜(实例)不一定有同一的接口。可以就一个类,但其组成不一样,生成步骤不一样。

简单一句话就是:“工厂方法”或者“抽象工厂”是点餐吃,“生成器”是自己做。

【作用意图】
将复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。需要注意以下几点:
    1、构建与表示分离:表明生成器模式的结构,构建过程被封装在导航器中,生成器则实现具体的表示。
    2、同样的构建过程:生成器模式关注的是构建过程,即构建过程是相同的。
    3、不同的表示:生成器模式并不在意产生对象的结果,其构造的产品不一定有相同的类型。

【使用场合】
创建复杂对象的算法(方法)应该独立于该对象的组成部分及其装配方式,
(菜谱的每个组成部分具体什么生成的,应该被独立出来。)

以及构造过程必须允许被构造的对象有不同表示情况下使用生成器模式。
(构造出来的菜谱有不同的表示:西红柿烧茄子、苦瓜炒蛋等。)    
    
主要适用于创建一些复杂的对象,这些对象的内部构建间的建造顺序通常是稳定的,
但对象内部的构建通常面临着复杂的变化。
    
在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
    
【效果】
1、可以轻松地改变产品的内部表示,同时也隐藏了产品如何组装的细节。
      我们可以通过更换“菜谱生成器”就可以了。(如:苦瓜炒蛋生成器、西红柿烧茄子生成器。)
2、将构造代码和表示代码分开。(菜谱的几个组成部分的构造代码和几个组成部分的具体表示代码分开。)
3、构造过程可以更精细地控制,生成器模式强调的是产品的构造过程,
      每个生成器是根据数据一步一步构建最终结果的,所以能精确的控制生成器构建的每一个结果。
4、每个特定的生成器都独立于其他的生成器,同时独立于程序的其他部分,
      这一点提高了对象的模块性,并使添加其他的生成器变得相对简单。

【加深理解】
生成器模式与抽象工厂的区别:
    生成器模式关注于将构造对象的过程和构造的各个部分分开,而抽象工厂关注于构建一个产品系列。
    实际上,最大的区别是生成器模式创建的产品不一定有共同的父类,只要有类似的构造过程即可。
    不同生成器产生的对象可能不属于同一类型,因此使用生成器的客户必须知道产品的具体类型。
    
    抽象工厂返回的是一系列相关的类,而生成器是根据提供给他的数据一步一步的构建一个复杂的对象。
    抽象工厂模式一次返回一系列复杂的相关类,
    生成器模式则是一步一步的判断数据,一步一步地生成一个复杂的对象。
    一个并不需要实际的数据,一个需要实际数据,依赖于实际数据来生成。

【实现类图】

原创粉丝点击