您的位置:首页 > 编程语言 > Java开发

Java设计模式之建造者模式(一)

2016-09-29 11:48 344 查看
一、概念描述

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 [构建与表示分离,同构建不同表示]

与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。

建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。

举个简单的例子,如汽车,有很多部件,车轮,方向盘,发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一部汽车,这个装配过程也很复杂(需要很好的组装技术), builder模式就是为了将部件和组装分开。

阎宏博士的《JAVA与模式》是这样描述建造(Builder)模式的:

建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

二、建造模式的结构

建造着模式利用一个导演者对象和具体建造者对象一个个地建造出所有的零件,从而建造出完整的产品对象。建造者模式将产品的结构和产品的零件的建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造者零件的责任分割开来,达到责任划分和封装的目的。



在这个示意性的系统里,最终产品Product只有两个零件,即part1和part2。相应的建造方法也有两个:buildPart1()和buildPart2()、同时可以看出本模式涉及到四个角色,它们分别是:

抽象建造者(Builder)角色:给 出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者 (ConcreteBuilder)角色。

具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(buildPart1和 buildPart2),另一种是返还结构方法(retrieveResult)。一般来说,产品所包含的零件数目与建造方法的数目相符。换言之,有多少 零件,就有多少相应的建造方法。

具体建造者(ConcreteBuilder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。2.在建造过程完成后,提供产品的实例。

导演者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。

产品(Product)角色:产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。

导演者角色是与客户端打交道的角色。导演者将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但是却不为客户端所知。

一般来说,每有一个产品类,就有一个相应的具体建造者类。这些产品应当有一样数目的零件,而每有一个零件就相应地在所有的建造者角色里有一个建造方法。

三、源码

产品(Product)角色:

package com.test.builder2;

public class Product {
String part1;
String part2;
public String getPart1() {
return part1;
}
public String getPart2() {
return part2;
}
public void setPart1(String part1) {
this.part1 = part1;
}
public void setPart2(String part2) {
this.part2 = part2;
}

}


抽象建造者(Builder)角色:

package com.test.builder2;

public interface Builder {
public void buildPart1();
public void buildPart2();

public Product returnProduct();

}


具体建造者(ConcreteBuilder)角色:

package com.test.builder2;

public class ConcreteBuilder implements Builder{

private Product product = new Product();

@Override
public void buildPart1() {
product.setPart1("part1");
System.out.println("build part1");

}

@Override
public void buildPart2() {
product.setPart2("part2");
System.out.println("build part2");

}

@Override
public Product returnProduct() {
System.out.println("return product");
return product;
}

}


导演者(Director)角色:

package com.test.builder2;

public class Director {
private Builder builder;

public Director(Builder builder) {
this.builder = builder;
}

public void construct(){
System.out.println("start build product");

builder.buildPart1();
builder.buildPart2();

builder.returnProduct();
}

}


客户端主类:

package com.test.builder2;

public class Client {

public static void main(String[] args) {
// TODO Auto-generated method stub
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
director.construct();

}

}


执行结果:

start build product
build part1
build part2
return product


客户端负责创建导演者和具体建造者对象。然后客户端把具体建造者对象交给导演者,导演者操作具体建造者,开始创建产品。当产品完成后,建造者把产品返还给客户端。

把创建具体建造者对象的任务交给客户端而不是导演者对象,是为了将导演者对象与具体建造者对象的耦合变成动态的,从而使导演者对象可以操纵数个具体建造者对象中的任何一个。

参考:

http://www.cnblogs.com/java-my-life/archive/2012/04/07/2433939.html

http://www.cnblogs.com/devinzhang/archive/2012/01/06/2314670.html

http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息