您的位置:首页 > 产品设计 > UI/UE

初识Java设计模式之Builder

2016-03-22 10:54 525 查看
定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

Builder 模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类

型和内容就可以构建它们.用户不知道内部的具体构建细节.Builder模式是非常类似抽象

工厂模式,细微的区别大概只有在反复使用中才能体会到.

为何使用?

是为了将构建复杂对象的 过程 和它的 部件 解耦.注意: 是解耦 过程 和 部件 .

因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮 方向盘 发动机

还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车,这个装配

过程也很复杂(需要很好的组装技术),Builder 模式就是为了将部件和组装过程分开.

如何使用?

首先假设一个复杂对象是由多个部件组成的,Builder 模式是把复杂对象的创建和部件的

创建分别开来,分别用 Builder 类和 Director 类来表示.

首先,需要一个接口,它定义如何创建复杂对象的各个部件:

public interface Builder {
//创建部件 A 比如创建汽车车轮
void buildPartA();
//创建部件 B 比如创建汽车方向盘
void buildPartB();
//创建部件 C 比如创建汽车发动机
void buildPartC();
//返回最后组装成品结果 (返回最后装配好的汽车)
//成品的组装过程不在这里进行,而是转移到下面的 Director 类
中进行.
//从而实现了解耦 过程 和 部件
Product getResult();
}


用 Director 构建最后的复杂对象,而在上面 Builder 接口中封装的是如何创建一个个部

件(复杂对象是由这些部件组成的),也就是说 Director 的内容是如何将部件最后组装成

成品:

public class Director {
private Builder builder;
public Director( Builder builder ) {
this.builder = builder;
}
// 将部件 partA partB partC 最后组成复杂对象
//这里是将车轮 方向盘和发动机组装成汽车的过程
public void construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}



Builder 的具体实现 ConcreteBuilder:通过具体完成接口 Builder 来构建或装配产品的部件;定义并明确它所要创建的是什么具体东西;提供一个可以重新获取产品的接口:

public class ConcreteBuilder implements Builder {
Part partA, partB, partC;
public void buildPartA() {
//这里是具体如何构建 partA 的代码
};
public void buildPartB() {
//这里是具体如何构建 partB 的代码
};
public void buildPartC() {
//这里是具体如何构建 partB 的代码
};
public Product getResult() {
//返回最后组装成品结果
};
}
复杂对象:产品 Product:

public interface Product { }


复杂对象的部件:

public interface Part { }


我们看看如何调用 Builder 模式:

ConcreteBuilder builder = new ConcreteBuilder();
Director director = new Director( builder );
director.construct();
Product product = builder.getResult();


分析总结

效果:

1 隐藏产品的内部表示

  Builder提供创建产品的接口给Director,

  隐藏了产品的内部结构(仅提供接口BuildPart()创建产品)

  隐藏该产品是如何装配的(BuildPart()内部装配是隐藏的)。

2 将构造代码和表示代码分开

  构造代码是在Builder提供的接口中完成的,每个ConcreateBuilder包含了创建和装配一个特定产品的所有代码。

  提供不同的Builder,使用相同的Director导向过程可以得到不同的表示。

  使用的不同Client可以使用相同的Builder,得到不同相同的表示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: