在未上大学之前,一直有个梦想“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();@Overridepublic void buildPart1() {System.out.println("构造兰博基尼的第一部分。");production.setPart1("This is part1 of Lamborghini");}@Overridepublic void buildPart2() {System.out.println("构造兰博基尼的第二部分。");production.setPart2("This is part2 of Lamborghini");}@Overridepublic 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();@Overridepublic void buildPart1() {System.out.println("构造法拉利的第一部分。");production.setPart1("This is part1 of Ferrari");}@Overridepublic void buildPart2() {System.out.println("构造法拉利的第二部分。");production.setPart2("This is part2 of Ferrari");}@Overridepublic 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

转载于:https://www.cnblogs.com/AndroidJet/p/7737609.html

我的Java设计模式-建造者模式相关推荐

  1. Java 设计模式——建造者模式(Builder Pattern)

    前言 一.简介 ​二.实现方式 三.常见第一种方式 (1)一般有以下几个角色 (2)举个例子 (3)具体步骤 (4)具体代码 三.第二种方式 (1)主要有三个角色:抽象建造者.具体建造者.产品 (2) ...

  2. Java设计模式 建造者模式

    前言 建造者模式(Builder Pattern)又称为创建者模式,建造者模式使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在该模 ...

  3. 设计建造者模式java代码,Java设计模式-建造者模式

    定义 Separate the construction of a complex object from its representation so that the sameconstructio ...

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

    概念:使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. ...

  5. Java设计模式-建造者模式 理论代码相结合

    继工厂模式后的建造者模式,也是java中常常能够见到的模式一种,应用场景也比较广,比较好用. 大家想了解的话,一起来看一看啦.

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

    目录 前言 一.什么是建造者模式 二.建造者模式的结构 三.建造者模式应用场景 参考文章 前言 在听完厉风行老师<设计模式系列课程>中的建造者模式一节后顿时感觉有点头大,感觉它有点像工厂方 ...

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

    建造者模式 建造者模式就是一步一步的创建一个复杂的对象,而且允许用户指定复杂对象的类型和内容. Builder 类是一个抽象类,用于定义一些创建子部件的方法,Builder类中应该还有一个 getRe ...

  8. JAVA设计模式 - 建造者模式

    建造者模式 , 又称为生成器模式 . 是创建型模式之一 . 与工厂方法模式和抽象工厂模式不同 , 这两种模式的目的是为了实现多态性 , 而建造者模式的目的则是为了将对象的构建与展示分离 .       ...

  9. 【面试高频】Java设计模式-建造者模式

    ⭐️写在前面 这里是温文艾尔的学习之路

最新文章

  1. tomcat重启后session没有清除的解决办法
  2. 11:菜单自动化软件部署经典案例
  3. opencv 计时 帧率
  4. CSS学习16之层级
  5. 数据中心网络架构和设计指南
  6. go---字符串截取
  7. 2017-2018-1 20155301 《信息安全系统设计基础》第7周学习总结
  8. 开工啦~Spring 完美导入 IDEA
  9. java 线程安全的原因_java的多线程:java安全问题产生的原因与JMM的关系
  10. 得物回应中消协点名批评:感谢监督 涉及案例已处理完结
  11. 需要友元的原因及使用
  12. java编写一个测试类_java写一个类,并测试它
  13. 无法加载JIT编译器问题解决
  14. linux关闭监听端口命令,如何在Linux系统中监听和关闭端口
  15. [原创]分布光纤测温DTS产品在市场上两种主流产品架构的区别与对比-未来趋势必然向单板化方向发展
  16. java学习之springcloud之服务注册与发现篇
  17. angularJS简介
  18. 云杰恒指:7.19恒指期货早盘资讯
  19. UCASE() 函数
  20. esp分区中的EFI启动项文件有什么用

热门文章

  1. SAP CRM Enterprise search后退按钮的实现
  2. python实现监控电脑打开网页_Python轻松实现动态网页爬虫(附详细源码)
  3. python爬虫cookie池 与ip绑定_Python爬虫防封ip的一些技巧
  4. vsflexgrid单元格换行后自动使用行高_Excel表格不会换行?10个超实用Excel小技巧,用了都说好!...
  5. go 语言 mysql_Go语言基础之操作MySQL
  6. android 照片多选,Android: 关于系统相册多选图片的问题
  7. ccxprocess启动项可以禁用么_Mac怎么禁用Adobe无用自启动项-Mac禁用Adobe无用自启动项方法 - 河东软件园...
  8. kingcms php 排序 标签,修改PHPCMS V9列表排序,listorder、order排序功能的方法
  9. aes加密结果不一样_医生告诉你:家用血糖仪和静脉血糖结果不一样,应该相信哪一个?...
  10. clang编译c语言,clang没有编译c程序?