在未上大学之前,一直有个梦想“I have a dream!”,就是能成为一位汽车工程师,一直幻想着开着自己设计的汽车飞奔在公路上,迷倒了万千少女。咳咳~~虽然现在没实现我的dream,但梦想还是得有的。

说到建造者模式,汽车绝对是典型的列子。汽车本身就是复杂产品对象,其制造过程可以形象的表示建造者模式。

一、建造者模式

定义

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

特点

  1.在某些属性没有赋值之前,复杂对象不能作为一个完整的产品使用。比如汽车包括方向盘、车门、发动机等各部件,缺少了这些部件就不能生产使用。

  2.对象的一些属性必须按照顺序赋值,比如汽车应有车架才能装车轮和其他部件。

UML

从上面的UML可以看出,建造者模式涉及到以下四个角色的概念:

  - 抽象建造者角色:提供一个接口,规范产品对象的建造,一般由子类实现。一般来说,产品的组成部分数与建造方法数相同,即有多少组成部分,就有多少个建造方法。

  - 具体建造者角色:该角色实现了抽象建造者抽象建造者接口,主要是实现所有声明的方法以及返回建造好的产品实例。

  - 导演者角色:负责调用具体建造者按照顺序建造产品。导演者只负责调度,真正执行的是具体建造者角色。

  - 产品角色:该角色是建造的复杂对象,提供基本方法。

二、实战

上代码

现在要做两辆万众瞩目的豪车,一辆兰博基尼,fine。另一辆法拉利,ok。一起来看看怎么造这两台车...

产品角色代码如下:

public class Production {

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

抽象建造者角色代码如下:

public interface IBuilder {

	// 产品有多少个组件,就有多少个建造方法

	public void buildPart1();

	public void buildPart2();

    // 返回产品类
public Production build(); }

首先来看兰博基尼怎么做,代码如下:

public class BuilderA implements IBuilder {

	private Production production = new Production();

	@Override
public void buildPart1() {
System.out.println("构造兰博基尼的第一部分。");
production.setPart1("This is part1 of Lamborghini");
} @Override
public void buildPart2() {
System.out.println("构造兰博基尼的第二部分。");
production.setPart2("This is part2 of Lamborghini");
} @Override
public Production build() {
System.out.println("咔擦!兰博基尼已造好!");
return production;
}
}

导演者角色调度构建,代码如下:

public class Director {

	private IBuilder builder;

	public Director(IBuilder builder){
this.builder = builder;
} /**
* 构造顺序
*/
public Production construct(){
builder.buildPart1();
builder.buildPart2(); return builder.build();
} }

下面看看客户端如何使用建造者模式把兰博基尼造出来,代码如下:

public class Client {

	public static void main(String[] args){

		// 兰博基尼
IBuilder builderA = new BuilderA();
Director directorA = new Director(builderA);
directorA.construct(); } }

运行客户端代码,结果如下:

构造兰博基尼的第一部分。

构造兰博基尼的第二部分。

咔擦!兰博基尼已造好!

接下来要造法拉利了,步骤一样,先实现抽象建造者接口。

法拉利具体建造者代码如下:

public class BuilderB implements IBuilder {

	private Production production = new Production();

	@Override
public void buildPart1() {
System.out.println("构造法拉利的第一部分。");
production.setPart1("This is part1 of Ferrari");
} @Override
public void buildPart2() {
System.out.println("构造法拉利的第二部分。");
production.setPart2("This is part2 of Ferrari");
} @Override
public Production build() {
return production;
}
}

客户端建造法拉利代码如下:

public class Client {

	public static void main(String[] args) {

		// 法拉利
IBuilder builderB = new BuilderB();
Director directorB = new Director(builderB);
directorB.construct();
} }

客户端运行结果如下:

构造法拉利的第一部分。

构造法拉利的第二部分。

咻咻!法拉利已造好!

三、建造者模式的优缺点

优点

1)降低代码耦合度。在建造者模式中,客户端不需要知道产品内部是如何实现的,我们只需得到产品的对象。并且使用导演者和建造者分离组装过程和组件具体构造过程,具有灵活的扩展性。

2)优秀的扩展性。具体建造者相互独立,方便扩展,符合开闭原则。

缺点

1)一定的使用范围限制。建造者模式的产品的组件基本相同,如果产品的差异性较大,建造者模式就不适用了。

四、比较

跟工厂方法模式对比:建造者模式和工厂模式同样是创建一个产品,工厂模式就是一个方法,而建造者模式有多个方法,并且建造者模式是有顺序的执行方法。就是说建造者模式强调的是顺序,而工厂模式没有顺序一说。

总结

好了,兰博基尼和法拉利的都拥有了,体验了一会人生赢家的感觉。上一篇工厂模式跟建造者模式还是蛮相似的,有兴趣可以翻看,斟酌两种模式的不同之处,这个方式对学习设计模式帮助巨大。下一篇观察者模式,敬请关注!

设计模式Java源码GitHub下载https://github.com/jetLee92/DesignPattern

我的Java设计模式-建造者模式的更多相关文章

  1. 3.java设计模式-建造者模式

    Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...

  2. java设计模式——建造者模式

    一. 定义与类型 定义:将一个复杂对象的构建与它的表示分离,使用同样的构建过程可以创建不同的表示 用户只需制定需要建造的类型就可以得到它们,建造过程以及细节不需要知道 类型:创建型 建造者模式与工厂模 ...

  3. Java设计模式-建造者模式(Builder)

    将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. [构建与表示分离,同构建不同表示] 与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指 ...

  4. Java设计模式——建造者模式(创建型模式)

    概述   建造者模式也称为生成器模式,是一种对象创建型模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象.   建造者模式意在为重叠构造 ...

  5. Java设计模式--------建造者模式(Builder模式)

    Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构 ...

  6. java设计模式------建造者模式

    建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 类图 描述 Builder:定义一个建造者抽象类,以规范产品对象的各个组成部分的建造.这个接口 ...

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

    建造模式:        将一个复杂的对象的构建与它的表示分离,使得同样的构建 过程可以创建不同的. 建造模式表示是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内 ...

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

    title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对 ...

  9. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

随机推荐

  1. 二级缓存:EHCache的使用

    EHCache的使用 在开发高并发量,高性能的网站应用系统时,缓存Cache起到了非常重要的作用.本文主要介绍EHCache的使用,以及使用EHCache的实践经验. 笔者使用过多种基于Java的开源 ...

  2. 图像映射<map>、<area>

    1.<map>定义图像映射,图像映射(image-map)指带有可单击区域的一幅图像. 2.<area>定义图像映射中的区域,area元素永远嵌套在map元素内部,area元素 ...

  3. Win10微软帐户切换不回Administrator本地帐户的解决方法--(转,虽转但亲测有效)

    在Win10系统中经常会用到微软帐户登录,如应用商店等地方,不过一些用户反馈原来使用Administrator帐户被绑定微软帐户后无法切换回本地帐户,连[改用本地帐户登录]按钮都没有,那么怎么解决呢? ...

  4. C语言对函数操作的结果声明

    可以用来返回给调用者函数操作的状态值. /* 这是一份关于函数返回值定义的头文件. */ #ifndef _STATUS_H_ #define _STATUS_H_ #define STATUS in ...

  5. java中线程的状态详解

    一.线程的五种状态   线程的生命周期可以大致分为5种,但这种说法是比较旧的一种说法,有点过时了,或者更确切的来说,这是操作系统的说法,而不是java的说法.但对下面所说的六种状态的理解有所帮助,所以 ...

  6. 基于JAVA实现的排序算法总结

    常用的排序方法有:冒泡排序.快速排序.选择排序.插入排序.归并排序,除此之外,还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.希尔排序等,这里着重介绍下前半段列举的几种常见方法的实现. 1. 冒泡排序法: ...

  7. 关于Kafka 的 consumer 消费者处理的一些见解

    前言 在上一篇 Kafka使用Java实现数据的生产和消费demo 中介绍如何简单的使用kafka进行数据传输.本篇则重点介绍kafka中的 consumer 消费者的讲解. 应用场景 在上一篇kaf ...

  8. Sonar 数据库表关系整理一(续)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 简介:Sonar平台是目前较为流行的静态代码扫描平台,为了便于使用以及自己二次开发,有必要对它的数据库结构进行学习 ...

  9. 利用rsync+inotify实现数据实时同步脚本文件

    将代码放在Server端,实现其它web服务器同步.首先创建rsync.shell,rsync.shell代码如下: #!/bin/bash host1=133.96.7.100 host2=133. ...

  10. vsftp实现只能上传不能下载、删除权限配置

    vsftpd可以对每个用户特别限制.只要给那个用户建立一个设置文件,然后在文件里设置 在vsftpd.conf里加user_config_dir=/etc/vsftpd/vsftpd_user_con ...