当我们遇到类似汽车的装配,需要车轮、方向盘、发动机,还有各种小零件时,为了在构建过程中隐藏实现细节,就可以使用建造者模式 (Builder模式) 将部件和组装过程分离,使得构建过程和部件都可以自由扩展,两者之间的耦合也降到最低。建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的设计模式。

建造者模式的使用情景:

  • 相同的方法,不同的执行顺序,产生不同的事件结果时;
  • 多个部件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用时;
  • 当初始化一个对象特别复杂时;

建造者模式在 Java 开发中也较为常用,通常作为配置类的构造器将配置的构建和表示分离开来,同时也是将配置从目标类中隔离出来,避免过多的 setter 方法。

1.建造者模式

建造者模式
优点 1、良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节;
2、建造者独立,扩展性好;
缺点 1、会产生多余的 Builder 对象,消耗内存;

经典模式 UML 类图:

  • Product 产品类:产品的抽象类
  • Builder:抽象 Builder 类,规范产品的组建
  • ConcreteBuilder:具体的 Builder 类
  • Director:统一组装过程

简化模式 链式调用 UML 类图:

  • Product 产品类:产品的抽象类
  • Builder:抽象 Builder 类,规范产品的组建
  • ConcreteBuilder:具体的 Builder 类,链式调用

本篇我们给出的实现都是基于链式调用的。

1.链式调用

1、定义 Product 产品类(以组装计算机为例):

public abstract class Computer {protected String board;protected String display;protected String os;protected Computer() {}// 设置主板public void setmBoard(String board) {this.board = board;}// 设置显示器public void setmDisplay(String display) {this.display = display;}// 设置操作系统public abstract void setmOS();@Overridepublic String toString() {return "Computer{" + "board='" + board + '\'' + ", display='" + display + '\'' +", os='" + os + '\'' + '}';}
}

具体的 Computer 类:

public class MacBook extends Computer {protected MacBook() {}@Overridepublic void setmOS() {os = "mac OS Sierra";}
}

2、定义抽象 Builder 类,规范产品的组建:

public abstract class Builder {// 设置主板public abstract Builder setBoard(String board);// 设置显示器public abstract Builder setDisplay(String display);// 设置操作系统public abstract Builder setOS();// 创建 Computerpublic abstract Computer create();
}

具体的 Builder 类:

public class MacBookBuilder extends Builder {private Computer mComputer = new MacBook();@Overridepublic Builder setBoard(String board) {mComputer.setmBoard(board);return this;}@Overridepublic Builder setDisplay(String display) {mComputer.setmDisplay(display);return this;}@Overridepublic Builder setOS() {mComputer.setmOS();return this;}@Overridepublic Computer create() {return mComputer;}
}

链式调用的关键点是每个 setter 方法都返回自身,也就是 return this; 这样就使得 setter 方法可以为链式调用。

测试代码:

@Test
public void test() throws Exception {// 链式调用Computer computer = new MacBookBuilder().setBoard("Intel").setDisplay("Retina").setOS().create();
}

Java 设计模式情景分析——建造者模式相关推荐

  1. Java 设计模式情景分析——策略模式

    当实现某功能需要根据实际情况选择不同的算法或者策略时,可以选择通过硬编码的方式(if-else 或者 switch-case)来实现,但是这样会使这个类变得臃肿,维护成本上升,出错率也变大了.基于这样 ...

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

    目录 一.建造者模式 二.建造者模式的结构 1.抽象建造者(Builder) 2.具体建造者(ConcreteBuilder) 3.指挥者(Director) 4.产品(Product) 三.建造者模 ...

  3. JAVA设计模式之【建造者模式】

    建造者模式 建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品 角色 Builder抽象建造者 buildPartX getResult ConcreteBuilder具体建 ...

  4. Java 设计模式情景分析——观察者模式

    观察者模式是一种使用频率非常高的模式,有时也被称作发布/订阅模式,属于行为型模式,它最常用的是 GUI 系统.发布/订阅系统,它一个重要作用就是解耦,使得它们之间的依赖性更小.观察者模式定义了对象间一 ...

  5. 重学 Java 设计模式:实战建造者模式「各项装修物料组合套餐选配场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获!

  6. java 设计模式实战,建造者模式之生产线

    非常感谢你阅读本文,欢迎[

  7. Java设计模式之中介者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  8. Java设计模式之享元模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  9. java设计模式4--建造者模式(Builder)

    本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离 ...

最新文章

  1. C++11之右值引用(三):使用C++11编写string类以及“异常安全”的=运算符
  2. 弹性碰撞后速度方向_MEMS加速度计辐射效应
  3. 社保,交得越多亏得越多(转)
  4. pythondict(zip())_python基础:zip和dict详解
  5. C语言 十进制整数字符串转十六进制字符串
  6. 【概率与期望】[UVA11021]Tribles
  7. javascript 变量作用域
  8. Nature 子刊重磅:腾讯与钟南山团队发布新冠危重症 AI 预测模型 Cox
  9. Thymeleaf模板的使用
  10. java treemap_Java TreeMap的排序
  11. oracle常用函数介绍
  12. pythonista安装tkinter_Python又把GUI界面攻下了,今天就告诉你怎么玩
  13. 条件查询时,如果有的输入框不输入,后台应该怎么处理?
  14. Android,APP图标尺寸
  15. 电视台‘自制好剧’,大量剧本从何来?
  16. HDU6357 Hills And Valleys
  17. linux系统安装达梦数据库
  18. 关于Dlink和ADSL不和谐的解决
  19. 【科软课程-信息安全】Lab7 Format String Vulnerability Lab
  20. packet tracer 下载及简介

热门文章

  1. layui导出excel
  2. Pandas快速入门
  3. PageHelper插件失效问题,PageHelper.startPage(start,size)没有起作用。
  4. frp实现socks5代理
  5. 4月N2知识冲刺(1)
  6. 什么是CC攻击?防御CC需要怎么防御?
  7. 万得资讯 java开发面经
  8. LeetCode 121 Best Time to Buy and Sell Stock(股票买入卖出的最佳时间)
  9. 【自然语言处理概述】百度百科数据爬取
  10. 江苏事业单位招聘考计算机专业课,江苏省事业单位计算机专技岗备考指南