最近在看图解设计模式,其中使用的是java来实现,但是发现其中有的看完后并不知道这个模式是用来干嘛的。一知半解下。通过网上资料辅助理解。就此记录。

后来发现,并不是看不懂,只是书上的例子有些比较老,对比网上的多个例子用的简化方法,书中写的例子都是经典案例,这里记录两种案例。

为什么要用builder模式

对于一个实体类,有两种方法实现构造
方法一、参数不同的构造函数

public class Computer {...public Computer(String cpu, String ram) {this(cpu, ram, 0);}public Computer(String cpu, String ram, int usbCount) {this(cpu, ram, usbCount, "键盘");}public Computer(String cpu, String ram, int usbCount, String keyboard) {this(cpu, ram, usbCount, keyboard, "显示器");}
}

缺点:构造函数多,当参数多时,含义不明,不易分辨。

new Computer( 1, 2, 3, 4, … )//参数多了就很繁琐

方法二、javabean模式

public class bean{public String username;public String password;XXXset();//实现set和get方法XXXget();
}

缺点:在使用中途,如果其中的属性值发生变化,要修改的不仅是字段,还有set和get方法,要改的多了,就很烦,还容易漏删、漏改。

builder模式就是为了解决这两个缺点。

什么时候用

当一个类的构造函数的参数多于四个,且有的参数是可选的,考虑使用builder模式

builder模式是什么

明白了为什么用builder和什么时候用后,就开始学习怎么用了。

常用方法(实现后可链式调用)

Computer为主类,其中定义一个静态内部类Builder,定义构造赋值必须的参数,定义set方法赋值可选的参数。

public class Computer {private final String cpu;//必须private final String ram;//必须private final int usbCount;//可选private final String keyboard;//可选private final String display;//可选private Computer(Builder builder){this.cpu=builder.cpu;this.ram=builder.ram;this.usbCount=builder.usbCount;this.keyboard=builder.keyboard;this.display=builder.display;}public static class Builder{//静态内部类private String cpu;//必须private String ram;//必须private int usbCount;//可选private String keyboard;//可选private String display;//可选public Builder(String cup,String ram){this.cpu=cup;//必选的参数,通过构造赋值this.ram=ram;}public Builder setUsbCount(int usbCount) {this.usbCount = usbCount;//可选的参数,通过set方法赋值return this;//链式编程的实现,返回当前的对象实例}public Builder setKeyboard(String keyboard) {this.keyboard = keyboard;return this;//链式编程的实现,返回当前的对象实例}public Builder setDisplay(String display) {this.display = display;return this;//链式编程的实现,返回当前的对象实例}        public Computer build(){return new Computer(this);//链式编程调用结束,返回当前的对象实例}}//省略getter方法
}

测试:

Computer computer=new Computer.Builder("因特尔","三星").setDisplay("三星24寸")//通过链式调用,观感明了,参数设置见名知意.setKeyboard("罗技").setUsbCount(2).build();//调用结束不要忘了

传统方法

public class Computer {private String cpu;//必须private String ram;//必须private int usbCount;//可选private String keyboard;//可选private String display;//可选public Computer(String cpu, String ram) {this.cpu = cpu;this.ram = ram;}public void setUsbCount(int usbCount) {this.usbCount = usbCount;}public void setKeyboard(String keyboard) {this.keyboard = keyboard;}public void setDisplay(String display) {this.display = display;}@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", ram='" + ram + '\'' +", usbCount=" + usbCount +", keyboard='" + keyboard + '\'' +", display='" + display + '\'' +'}';}
}

抽象Builder类

public abstract class ComputerBuilder {public abstract void setUsbCount();public abstract void setKeyboard();public abstract void setDisplay();public abstract Computer getComputer();
}

具体Builder类,

//第一个具体bulider
public class MacComputerBuilder extends ComputerBuilder {private Computer computer;public MacComputerBuilder(String cpu, String ram) {computer = new Computer(cpu, ram);}@Overridepublic void setUsbCount() {//具体的Builder类中包含其特有的set方法,且提前定义值computer.setUsbCount(2);}@Overridepublic void setKeyboard() {computer.setKeyboard("苹果键盘");}@Overridepublic void setDisplay() {computer.setDisplay("苹果显示器");}@Overridepublic Computer getComputer() {return computer;}
}//第二个具体bulider
public class LenovoComputerBuilder extends ComputerBuilder {private Computer computer;public LenovoComputerBuilder(String cpu, String ram) {computer=new Computer(cpu,ram);}@Overridepublic void setUsbCount() {computer.setUsbCount(4);}@Overridepublic void setKeyboard() {computer.setKeyboard("联想键盘");}@Overridepublic void setDisplay() {computer.setDisplay("联想显示器");}@Overridepublic Computer getComputer() {return computer;}
}

Director类

public class ComputerDirector {public void makeComputer(ComputerBuilder builder){builder.setUsbCount();builder.setDisplay();builder.setKeyboard();}
}

测试(未完)

public static void main(String[] args) {ComputerDirector director=new ComputerDirector();//1ComputerBuilder builder=new MacComputerBuilder("I5处理器","三星125");//抽象builder用具体的builder来实例化director.makeComputer(builder);//通过具体的Builder类来指导DirectorComputer macComputer=builder.getComputer();//4System.out.println("mac computer:"+macComputer.toString());ComputerBuilder lenovoBuilder=new LenovoComputerBuilder("I7处理器","海力士222");director.makeComputer(lenovoBuilder);Computer lenovoComputer=lenovoBuilder.getComputer();System.out.println("lenovo computer:"+lenovoComputer.toString());
}

题外话:StringBuilder是可以用链式编程的


StringBuilder builder = new StringBuilder().builder.append("blake").append("bob").append("alice").append("linese").append("eve");

就是利用以下方式实现链式编程的

@Overridepublic StringBuilder append(String str) {super.append(str);return this;//返回当前的对象实例}

参考:秒懂设计模式之建造者模式(Builder pattern)

23种设计模式之builder模式相关推荐

  1. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  2. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

  3. 【Go实现】实践GoF的23种设计模式:命令模式

    上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...

  4. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

  5. 23种设计模式之命令模式和策略模式的区别

    文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...

  6. 23种设计模式之代理模式

    文章目录 代理模式的定义与特点 代理模式的结构与实现 模式的结构 模式的实现 代理模式的应用场景 代理模式的应用实例 代理模式的扩展 代理模式分类 静态代理 动态代理 在有些情况下,一个客户不能或者不 ...

  7. 23种设计模式----中介者模式----行为型模式

    中介者模式 1.什么是中介者模式 2.中介者模式的角色 3.例子 3.1 项目结构 3.2 共同实体 3.3 抽象的中介者 3.4 抽象的被中介者 3.5 具体的中介者 3.6 具体的被中介者 3.7 ...

  8. 2.5万字详解23种设计模式—创建型模式(简单工厂、工厂方法、抽象工厂、单例-多线程安全详解、建造者、原型)的详细解读、UML类图

    本文简述了各大设计模式,并通过UML和代码详细说明.本文大约共 2.5W 字,建议收藏.下方是本文的目录: 一.设计模式的认识 二.设计模式的分类 根据其目的 根据范围 三.设计模式的优点 四.设计模 ...

  9. 23种设计模式-行为型模式-访问者模式

    在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根据药品名称和数量计算总价,而药房工作人员根据药品名称和数量准备药品,如下图所示. 在软件开发中,有时候也需 ...

  10. 23种设计模式-行为型模式-观察者模式

    概述 它用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应.在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多 ...

最新文章

  1. 吐血整理:手拿几个大厂offer的秘密武器!
  2. python基础知识和运用
  3. java搜索文件_Java如何在目录中搜索文件?
  4. SourceTree查找Github修改记录的技巧
  5. 【SSH网上商城项目实战19】订单信息的级联入库以及页面的缓存问题
  6. 图说世界编程语言排行
  7. Activiti 5.3:子流程(subProcess)
  8. 基于参考点的非支配遗传算法-NSGA-III(一)
  9. ggplot2 | 使用小提琴图+箱形图+抖动图展示数据分布情况
  10. 好的技术文章应该让读者更自信而不是更自卑
  11. [译]理解Node.js事件驱动机制
  12. NeurIPS、COLING顶会亮点有哪些 | 一周学术精选
  13. 【空间分析】7 叠置分析和缓冲区分析
  14. 论文投稿指南——计算机领域核心期刊
  15. 怎样用捷速PDF编辑器修改PDF文档
  16. serv-u and hway3.0
  17. NYOJ-108-士兵杀敌(一)
  18. 程序员得浪漫--十款表白小程序 一个比一个浪漫 赶紧收藏起来吧!!!
  19. 忘记保护密码情况下卸载瑞星杀毒软件
  20. ios系统铃声调用方法

热门文章

  1. 加密狗Android软件,加密狗app
  2. 浏览器软件下载,点击超链接、图标等直接下载(前后端代码)
  3. Hive grouping sets 多维度交叉清洗数据
  4. 原生JS路由实现页面跳转
  5. 53-20210316华为海思Hi3516DV300的linux系统通过网口刷机(eMMC模式)
  6. 空调开关html,酒店墙上空调开关图解—酒店墙上空调开关图案是什么意思
  7. 比神经网络更高级的算法,人工神经网络是算法吗
  8. 我要写整个中文互联网界最牛逼的JVM系列教程 | 「JVM与Java体系架构」章节:官方规范下载与参考书目
  9. AD smart pdf 中文丢失
  10. 手机型号修改 java_Android 中的设置关于手机中的型号的更改