设计模式——建造者

最近的心得,我发现学一门设计模式,不管你是否能立刻理解它,第一最要紧的是要记住两个东西。1、它是属于什么范畴的设计模式。2、记住UML图。这两个是打开这个设计模式之门的金钥匙!为什么这么讲?因为刚刚学新的设计模式,如果一味的埋头在文字中,思想中,代码编写的例子中,如果你这个设计模式又不是看的很懂,实在是会让人晕头转向看的吐血身亡。结果在身亡前,你都不知道这个设计模式干什么用,也不知该怎么去写。心得是,看完一篇设计模式文章,先记住它属于什么范畴的设计模式,然后就是把UML类图背记下来。再然后回头再看一遍,这样你可能就慢慢懂了些。也能很快的通过uml图编写出代码来。即便此时你不是很深刻的理解他。因为设计模式,无非就是设计出这样的类的关系来,所以记住了范畴和uml类图,不管三七二十一,碰到这个需求,先按照这样的关系来设计。久而久之,你就能越来越明白这个设计模式的精髓到底是什么了。

好,今天讲的是建造者。

    1、认识建造者

建造者模式属于创建型模式(先记下)。顾名思义,builder的意思是建造者或者建筑工人。例如:楼房是千差万别的,楼房的外形,层数,内部房间的数量,房间的装饰都不一样。但是对于建造者来说,抽象出来的建筑流程是确定的。因为建筑一座楼房,都可以归纳为几个步骤:1打桩、2建地基、3搭框架、4内部建设。同理,建造者设计模式也是基于这样的概念而生的,这个设计模式用来解决什么样的情况呢:即流程不变,但每个流程实现的具体细节是会变化的。这样的情况,可以考虑使用建造者。就像盖房子,4个流程都必须有,但每个流程各自的实现细节,各个房子各有不同。建造者模式的好处就是保证了流程不会变化,即流程不会增加也不会遗漏,也不会产生流程次序的错误。这是非常重要的,看新闻,一些楼歪歪的事件,很多都是建设楼盘的时候,流程出现了问题导致的。(看来这些人并不知道建造者模式啊)。而建造者模式,保证了流程的确定性,而流程内部的实现细节,是可继承扩展的。从根源上解决了流程不规范的问题。

福清有一道小吃叫海蛎饼,家家户户都会做,但各家各户做的味道都不同。虽然味道不同,但制作海蛎饼的流程步骤,大致都是一样的。一个成功的海蛎饼,外酥内嫩,滋味丰富。虽然口感各有不同,但只要流程步骤不差,都会做出好吃的海蛎饼。而一些刚嫁人的新媳妇们制作海蛎饼却不如婆婆好,因为新媳妇刚学做,不熟悉流程,难免流程常有疏漏。而如果让婆婆站在媳妇旁把控制作流程,海蛎饼就不会差。所以说,如果流程控制好了,生产出来的海蛎饼就不会差。

写代码也是如此,如果你遇到一个需要把控流程,但流程中的实现细节各有许多的方式,你可以采用建造者模式。用一个director类把控流程,而用许多不同的builder去建造流程中的细节并产生产品。这样,生产出来的产品是绝对不会出问题的。因为流程把控好了。你可以有多个builder去负责建造生产产品,而让director去把控流程。如果有新的产品,但是流程一致,你可以再扩张出一个builder来。这样,你看,建造者模式是不是很符合OCP原则呢。

说了这么多,来看下建造者模式的概念:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以有不同的表示。

嗨,这个概念看起来总是这么深奥难懂。大概的意思,就是一套的构建过程可以有不同的产品(表示)出来。这些产品(表示)都按照这一套的构建过程被生产出来。

建造者模式通常包括以下这几个角色:

1、Builder:给出一个抽象接口,规范建造者对于生产的产品的各个组成部分的建造。这个接口只是定一个规范,不涉及具体的建造,具体的建造让继承于它的子类(ConcreteBuilder)去实现。

2、ConcreteBuilder:实现builder接口,针对不同的商业逻辑,具体化各对象部分的建造,最后返回一个建造好的产品。

3、Director:导演,顾名思义,负责规范流程之用。在指导中不涉及产品的创建,只负责保证复杂对象各部分被创建或按某种顺序创建。

4、Product:复杂对象。

按照惯例,给出建造者模式的UML图(这个先记下来,非常有用,学一个设计模式,先把这个图记下来!)

2、一个建造者的实例。

在此,以这篇文章作为参考http://blog.csdn.net/lovelion/article/details/7426015,我们来做一个游戏的案例。

游戏开发中,游戏角色是一个复杂的产品,它包括性别、脸型、身材等多个组成部分,不同的角色组成部分有所差异。如这张图:

无论是何种类型的游戏的游戏角色,它的创建步骤都大同小异,都需要逐步创建其组成部分,再将各组成部分装配成一个完整的游戏角色。

一个典型的复杂类对象代码示例如下:

class Productor {

private Part partA;

private Part partB;

private Part partC;

// 这些是各个部件的set和get的方法,在此省略。。。

}

这是抽象的Builder:

abstract class Builder {

public abstract void buildPartA();

public abstract void buildPartB();

public abstract void buildPartC();

}

继承Builder的具体的建造者:

class ConcreteBuilder extends Builder {

private Product product;

// 创建partA

public void buildPartA() {

// 在此创建出部件

Part partA = new PartA();

// ......

// 把partA传递给product

product.setPartA(partA);

}

// 创建partB

public void buildPartB() {

// 在此创建出部件

Part partB = new PartB();

// ......

// 把partB传递给product

product.setPartA(partB);

}

// 创建partC

public void buildPartC() {

// 在此创建出部件

Part partC = new PartC();

// ......

// 把partC传递给product

product.setPartA(partC);

}

// 返回复杂产品对象

public void getProduct() {

return this.product;

}

}

这是导演,负责流程规范,在导演类中可以注入建造者对象。

class Director {

private Builder concretebuilder;

// 构造方法中也可以传递builder

public Director(Builder builder) {

this.concretebuilder
= builder;

}

// 传递builder

public void setBuilder(Builder builder) {

this.concretebuilder
= builder;

}

// 这个方法用来规范流程,产品构建和组装方法

public void construct() {

builder.buildPartA();

builder.buildPartB();

builder.buildPartC();

}

}

// 客户端使用:

class Main {

public static void main(String[] args) {

// 对于客户端而言,只需要关心具体的建造者,无需关心产品内部构建流程。我如果需要其他的复杂产品对象,只需要选择其他的建造者,如果需要扩展,则只需要写一个新的builder就行。如果可以,这个建造者甚至可以用配置文件做,增加更多的扩展性。

Builder builder = new ConcreteBuilder();

// 把建造者注入导演

Director director = new Director(builder);

// 指挥者负责流程把控

director.construct();

// 建造者返回一个组合好的复杂产品对象

Productor productor = builder.getProductor();

}

}

不知道大家在此有否发现,上面的例子,通过使用建造者模式,建造过程通过Director的construct的方法固定下来了。建造过程不会变,但具体的部位,头,身体,脚的表现方式,让具体的builder去实现了。这样不仅使得小人的建造过程不变,而且有利于功能的扩展。

3、使用建造者模式的好处

1.使用建造者模式可以使客户端不必知道产品内部组成的细节。

2.具体的建造者类之间是相互独立的,对系统的扩展非常有利。

3.由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

4、使用建造者模式的场合:

1.创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。

2.要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。

时间: 2025-01-31 14:46:42

设计模式——建造者的相关文章

设计模式—建造者模式(Builder)

title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对象创建型模式.我们获得一个对象的时候不是直接new这个对象出来,而是对其建造者进行属性设置,然后建造者在根据设置建造出各个对象出来.建造者模式又可以称为生成器模式. 模式结构 一个标准的建造者模式包含如下角色: Builder:抽象建造者 ConcreteBuilder:具体建造者 Director

小菜学设计模式——建造者模式

背景 不要小看炒菜这件小事上,想要上一道佳肴,那是需要循规蹈矩,步步小心的.我相信你肯定在外面吃过没放盐的快餐,吃过放多了盐的快餐.....既然炒菜是一个如此复杂的过程,又必须循规蹈矩,那为什么不给他一个死规定呢?如果谁没有按照规定做事,就进行对应的提醒警告.这就是建造者模式的由来,限制规则步骤,但是开发规则细节.比如说盛菜之前必须放盐,那么规定一定要放盐,具体放多少自己论情况而定. 1.使用意图 如果你需要将一个复杂对象的构建与它的表示(构建具体过)分离,使得同样的构建过程可以创建不同的表示的

设计模式——建造者模式

HeadFirst中并没有把建造者模式(生成器模式)当做常用的设计模式来讲解,只是在附录中一带而过. 建造者模式的本质:       分离了对象组件的单独构造(由Builder来负责)和装配(由Director)来负责.从而可以构建出复杂的对象.这个模式适用于:某个对象的构建       过程复杂的情况先使用.由于实现了构建和装配的解耦.不同的构建器,相同的装配,也可以做出不同的对象相同的构建器不同的装配顺序也可以 做出不同的对象.也就是实现了构建算法.装配算法的解耦,实现了更好的复用. Dem

C#设计模式——建造者模式(Builder Pattern)

1.建造者模式简介 1.1>.定义 建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 1.2>.使用频率  中低 1.3>.原型模式应用 在软件系统中,有时候面临一个复杂对象的创建工作,该对象通常由各个部分子对象用一定的算法构成,或者按一定的步骤组合而成:这些算法和步骤是稳定的,而构成这个对象的子对象却经常由于需求的变化而不断变化. 生活中的例子,要组装一台电脑,它的组装过程基本是不变的,都可以由主板.CPU.内存等按照某个稳定方式组合而成.

C#设计模式-建造者模式

在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成. 例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由CPU.主板.硬盘.显卡.机箱等组装而成的,如果此时让采购员一台一台电脑去组装的话真是要累死采购员了,这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到一个建造者类对象里,建造者只要负责返还给客户端全部组件都建造完毕的产品对象就可以了.然而现实生活中也是如此的,如果公司要

Java设计模式——建造者模式

建造者模式(Builder Pattern)属于创建形的设计模式,使用多个简单的对象一步一步构建成一个复杂的对象. 主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定. 何时使用:一些基本部件不会变,而其组合经常变化的时候. 应用实例: 1.去肯德基,汉堡.可乐.薯条.炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的&quo

Python设计模式——建造者模式

需求,画人物,要求画一个人的头,左手,右手,左脚,右脚和身体,画一个瘦子,一个胖子 不使用设计模式 #encoding=utf-8 __author__ = '[email protected]' if __name__=='__name__': print '画左手' print '画右手' print '画左脚' print '画右脚' print '画胖身体' print '画左手' print '画右手' print '画左脚' print '画右脚' print '画瘦身体' 这样写的

php设计模式 — 建造者模式

需求分析: 我们接到了一个订单,是宝马公司和奔驰公司的,他们负责定义产品的零部件以及型号,我们负责生产,需求简单的描述就是这样. 我们需要为这个需求设计一个设计模式去更好的适应他们的需求. 首先我们需要一个车模型类,来定义好需要的所有零部件,这就叫做抽象类,之所以这样是因为我们还有可能接到更多公司的订单,比如劳斯莱斯,宾利. 然后由各自的车来继承这个抽象类,实现里面的方法. 接下来就需要一个建造者抽象类,来定义建造各自的车需要的方法 然后由各自车建造者来继承这个抽象类. 我们会想到一个建造模式了

C++设计模式——建造者模式

建造者模式 在GOF的<设计模式 可复用面向对象软件的基础>中是这样说的:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 这句话,似懂非懂的.一个复杂对象的创建,其通常是由很多的子对象构成:如果一个对象能够直接就创建好了,那么也不会称之为复杂对象.由于项目中需求的变化,这个复杂对象的各个部分经常会发生剧烈的变化,但是,不管怎么变化,将它们组合在一起,组成一个复杂的对象的事实是不会变的.建造者模式就提供了一种“封装机制”来将各个对象的变化隔离开,最终,组合成复杂对象的

PHP设计模式——建造者模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 建造者模式也称生成器模式,核心思想是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 例如:汽车,他的发动机引擎有好多品牌,轮胎也有各种材质,内饰更是千奇百怪:鸟,他的头.翅膀以及脚有各种颜色和形状,在创建这种复杂对象的时候,我们建议使用建造者模式. 类图: 建造者模式一般认为有四个角色: 1.产品角色,产品角色定义自身的组成属性 2.抽象建造者,抽象建造者定义了产品的创建过程以及如何