建造者模式


1. 实例

  • 定义一个电脑类,实例化电脑类对象,以及给对象的属性赋值
// 定义一个电脑类,实例化电脑类对象,以及给对象的属性赋值class Computer{private String cpu;private String gpu;private String memory;private String hard;public String getCpu() {return cpu;}public String getGpu() {return gpu;}public String getMemory() {return memory;}public String getHard() {return hard;}public void setCpu(String cpu) {this.cpu = cpu;}public void setGpu(String gpu) {this.gpu = gpu;}public void setMemory(String memory) {this.memory = memory;}public void setHard(String hard) {this.hard = hard;}@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", gpu='" + gpu + '\'' +", memory='" + memory + '\'' +", hard='" + hard + '\'' +'}';}
}// 客户端  =======================================public class Test01 {public static void main(String[] args) {Computer c = new Computer();c.setCpu("i9");c.setGpu("rtx3090");c.setHard("128T");c.setMemory("128g");System.out.println(c);}
}

上述方法缺点:
1. 客户端程序员,在实例化好对象后需要每个属性赋值,麻烦
2. 违反最少知道原则

建造者模式和工厂模式区别:
1. 工厂模式:实例化一个类对象即可。
2. 建造者模式:实例化对象后需要给对象属性赋值。


针对上面的问题,作者(服务端程序员)专门创建一个ComputerBuilder类,这个类专门负责封装组装电脑的过程。

// 建造者类必须关联相关产品(关联)
class ComputerBuilder{private Computer computer = new Computer(); // 字段关联public Computer build(){computer.setCpu("i9");computer.setGpu("rtx3090");computer.setHard("128T");computer.setMemory("128g");return computer;}
}// 客户端  =======================================public class Test01 {public static void main(String[] args) {ComputerBuilder cb = new ComputerBuilder();Computer c = cb.build();System.out.println(c);}
}

优点: 直接通过ComputerBuilder对象build一个对象即可,不用给属性赋值

缺点: 不能自定义属性值,只有一套属性可用,如果修改,违反开闭原则。


针对上面缺点,作者多增加几个建造者类即可。LowComputerBuilder;MiddleComputerBuilder;MiddleComputerBuilder

优点:可以根据客户需求建造不同产品。

缺点:
1. 不同建造者类的build方法中有些属性可能是不变的,代码可能出现重复。
2. build过程不稳定,如果漏掉一步,代码也不会报错,该属性=null。


针对上面的问题再次修改
1. 创建一个建造者接口,所有建造者类都要实现其接口,把步骤稳定下来。
2. 少实现一个接口中的抽象方法,代码就会报错。

// 定义一个电脑类,实例化电脑类对象,以及给对象的属性赋值class Computer{private String cpu;private String gpu;private String memory;private String hard;public String getCpu() {return cpu;}public String getGpu() {return gpu;}public String getMemory() {return memory;}public String getHard() {return hard;}public void setCpu(String cpu) {this.cpu = cpu;}public void setGpu(String gpu) {this.gpu = gpu;}public void setMemory(String memory) {this.memory = memory;}public void setHard(String hard) {this.hard = hard;}@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", gpu='" + gpu + '\'' +", memory='" + memory + '\'' +", hard='" + hard + '\'' +'}';}
}interface ComputerBuilder{void setCpu();void setGpu();void setMemory();void setHard();Computer build();
}// 建造者类必须关联相关产品(关联)
class HighComputerBuilder implements ComputerBuilder{private Computer computer = new Computer(); // 字段关联@Overridepublic void setCpu() {computer.setCpu("i9");}@Overridepublic void setGpu() {computer.setGpu("rtx3090");}@Overridepublic void setMemory() {computer.setMemory("128g");}@Overridepublic void setHard() {computer.setHard("128T");}public Computer build(){return computer;}
}class MiddleComputerBuilder implements ComputerBuilder{private Computer computer = new Computer(); // 字段关联@Overridepublic void setCpu() {computer.setCpu("i7");}@Overridepublic void setGpu() {computer.setGpu("rtx2090");}@Overridepublic void setMemory() {computer.setMemory("128g");}@Overridepublic void setHard() {computer.setHard("128T");}public Computer build(){return computer;}
}class LowComputerBuilder implements ComputerBuilder{private Computer computer = new Computer(); // 字段关联@Overridepublic void setCpu() {computer.setCpu("i3");}@Overridepublic void setGpu() {computer.setGpu("gtx1080");}@Overridepublic void setMemory() {computer.setMemory("128g");}@Overridepublic void setHard() {computer.setHard("128T");}public Computer build(){return computer;}
}// 客户端
public class Test01 {public static void main(String[] args) {// 低配ComputerBuilder cb = new LowComputerBuilder();cb.setCpu();cb.setGpu();cb.setHard();cb.setMemory();Computer c = cb.build();System.out.println(c);// 中配ComputerBuilder cb2 = new MiddleComputerBuilder();cb2.setCpu();cb2.setGpu();cb2.setHard();cb2.setMemory();Computer c2 = cb2.build();System.out.println(c2);// 高配ComputerBuilder cb3 = new HighComputerBuilder();cb3.setCpu();cb3.setGpu();cb3.setHard();cb3.setMemory();Computer c3 = cb3.build();System.out.println(c3);}
}

上诉方法

优点:
1. 设置属性步骤明确,不会出错
2. 客户端可以扩展,只需要implements ComputerBuilder接口即可

缺点:
1. 客户端还是需要设置每一个属性,违反最少知道原则(迪米特法则) 。
2. 虽然不用知道装电脑的细节(cpu=“i3”)(几个螺丝,什么颜色线),但是需要知道步骤(setCpu())(先装啥再装啥)


2. 建造者模式代码

  • 分析上面例子的优缺点,有如下代码

// 定义一个电脑类,实例化电脑类对象,以及给对象的属性赋值class Computer{private String cpu;private String gpu;private String memory;private String hard;public String getCpu() {return cpu;}public String getGpu() {return gpu;}public String getMemory() {return memory;}public String getHard() {return hard;}public void setCpu(String cpu) {this.cpu = cpu;}public void setGpu(String gpu) {this.gpu = gpu;}public void setMemory(String memory) {this.memory = memory;}public void setHard(String hard) {this.hard = hard;}@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", gpu='" + gpu + '\'' +", memory='" + memory + '\'' +", hard='" + hard + '\'' +'}';}
}interface ComputerBuilder{void setCpu();void setGpu();void setMemory();void setHard();Computer build();
}// 建造者类必须关联相关产品(关联)
class HighComputerBuilder implements ComputerBuilder{private Computer computer = new Computer(); // 字段关联@Overridepublic void setCpu() {computer.setCpu("i9");}@Overridepublic void setGpu() {computer.setGpu("rtx3090");}@Overridepublic void setMemory() {computer.setMemory("128g");}@Overridepublic void setHard() {computer.setHard("128T");}public Computer build(){return computer;}
}class MiddleComputerBuilder implements ComputerBuilder{private Computer computer = new Computer(); // 字段关联@Overridepublic void setCpu() {computer.setCpu("i7");}@Overridepublic void setGpu() {computer.setGpu("rtx2090");}@Overridepublic void setMemory() {computer.setMemory("128g");}@Overridepublic void setHard() {computer.setHard("128T");}public Computer build(){return computer;}
}class LowComputerBuilder implements ComputerBuilder{private Computer computer = new Computer(); // 字段关联@Overridepublic void setCpu() {computer.setCpu("i3");}@Overridepublic void setGpu() {computer.setGpu("gtx1080");}@Overridepublic void setMemory() {computer.setMemory("128g");}@Overridepublic void setHard() {computer.setHard("128T");}public Computer build(){return computer;}
}// 指挥者
class Director{public Computer build(ComputerBuilder cb){cb.setCpu();cb.setGpu();cb.setHard();cb.setMemory();return cb.build();}
}// =================================================================
// 客户端
// 扩展自定义配置
class SelfComputerBuilder implements ComputerBuilder{private Computer computer = new Computer();@Overridepublic void setCpu() {computer.setCpu("1");}@Overridepublic void setGpu() {computer.setGpu("12");}@Overridepublic void setMemory() {computer.setMemory("123");}@Overridepublic void setHard() {computer.setHard("1234");}@Overridepublic Computer build() {return computer;}
}public class Test01 {public static void main(String[] args) {ComputerBuilder lcb = new LowComputerBuilder();ComputerBuilder mcb = new MiddleComputerBuilder();ComputerBuilder hcb = new HighComputerBuilder();// 自定义ComputerBuilder scb = new SelfComputerBuilder();Director director = new Director(); // 指挥者// 低配Computer c = director.build(lcb);System.out.println(c);// 中配Computer c2 = director.build(mcb);System.out.println(c2);// 高配Computer c3 = director.build(hcb);System.out.println(c3);// 自定义Computer self = director.build(scb);System.out.println(self);}
}输出结果:
Computer{cpu='i3', gpu='gtx1080', memory='128g', hard='128T'}
Computer{cpu='i7', gpu='rtx2090', memory='128g', hard='128T'}
Computer{cpu='i9', gpu='rtx3090', memory='128g', hard='128T'}
Computer{cpu='1', gpu='12', memory='123', hard='1234'}

上面的代码就是使用了建造者模式

优点:
1. 创建对象的过程稳定不变,因为有ComputerBuilder接口
2. 设置对象属性封装好了,只需要编写一次(指挥者中build)
3. 客户端可以扩展功能,符合开闭原则

建造者和工厂模式区别:
1. 工厂模式只需要new一个产品即可
2. 建造者模式更加注重的是new 产品之后,对产品赋值属性的过程!


3. UML图

5. 原视频链接

https://www.bilibili.com/video/BV1Qx411o7tN?p=27

设计模式-建造者模式(5)相关推荐

  1. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  2. 说说设计模式~建造者模式(Builder)

    建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...

  3. 设计模式 建造者模式_设计模式:建造者

    设计模式 建造者模式 有时需要在应用程序中创建一个复杂的对象. 一种解决方案是Factory模式,另一种是Builder设计模式. 在某些情况下,您甚至可以结合使用这两种模式. 但是在本文中,我想研究 ...

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

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

  5. python创造者_python 设计模式-建造者模式

    问题:在上一篇python设计模式:抽象工厂模式中,我们尝试用抽象工厂模式规范化了 Pizza 原材料的供应以及 Pizza 的创建.但是我们忽略了一个问题,那就是每种 Pizza 的烘焙时间依赖于生 ...

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

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

  7. 设计模式-建造者模式(转自:http://www.cnblogs.com/cbf4life/archive/2010/01/14/1647710.html)...

    11.1 变化是永恒的 又是一个周三,快要下班了,老大突然拉住我,喜滋滋地告诉我:"牛叉公司很满意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我们公司制作了,不过这次又额外增 ...

  8. 大话设计模式—建造者模式

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

  9. 我的Java设计模式-建造者模式

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

  10. Java常用设计模式————建造者模式

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

最新文章

  1. linux rz xshell
  2. 数据结构两个月学完_这是我作为数据科学家两年来所学到的
  3. iif能用到mysql中吗_数据库基础知识:SQL中的IIF语句详解
  4. poj3190 区间贪心 挑战程序设计竞赛
  5. 解决w3wp.exe内存占用问题[转载]
  6. Java中的锁(转)
  7. 这个 DNS 新漏洞可导致大规模的 DDoS 攻击活动
  8. Windows 下 Git 的安装及如何与码云协作
  9. 拜水都江堰,问道青城山
  10. mysql 触发器 sql server_喜忧参半的SQL Server触发器
  11. 【342期】SpringBoot + Redis 布隆过滤器防恶意流量击穿缓存的正确姿势!
  12. 会议系统m900服务器网口灯,中兴视频会议mcu服务器zxv10-m900
  13. Android7.1 Kyguard界面灭屏时间分析
  14. 【机器学习】决策树原理、调参、可视化 + 银行信用卡欺诈检测案例(含数据集)
  15. 中级会计还考职称计算机吗,如何应对中级会计职称考试全面实行无纸化
  16. 视频倒放怎么制作?快来学会这几个简单的方法
  17. 积分制管理系统:添加员工
  18. 中兴C200、C220 OLT常用命令
  19. 数据库SQL语言DQL语法笔记整理
  20. C++库std::future

热门文章

  1. android开发教程!看懂这些帮你轻松解决就业问题!知乎上转疯了!
  2. 在服务器上下载安装anaconda
  3. JavaScript 图像对象
  4. 项目管理必看书籍推荐
  5. 树莓派Win10镜像下载安装教程及使用初体验
  6. java 水波纹_java实现水波纹扩散效果
  7. Nginx反向代理:多域名跳转多台服务器(研发需求)
  8. 计算机脚本模板,mv分镜头脚本范文mv的分镜头脚本格式.doc
  9. 计算机控制d a数模转换实验,实验一 D、A数模转换实验
  10. php pdo 遍历,PHP PDO操作总结