目录

  • 一、建造者模式
  • 二、建造者模式的结构
    • 1、抽象建造者(Builder)
    • 2、具体建造者(ConcreteBuilder)
    • 3、指挥者(Director)
    • 4、产品(Product)
  • 三、建造者模式的优缺点
    • 1、优点
    • 2、缺点
  • 四、违背原则方案
    • 1、电脑接口
    • 2、主机
    • 3、显示器
    • 4、键盘
    • 5、鼠标
    • 6、组装电脑
    • 7、控制台显示
  • 五、建造者模式改善代码
    • 1、电脑接口
    • 2、组装电脑实现类
    • 3、建造者方法
    • 4、控制台显示

一、建造者模式

通俗的讲,比如你想组装一个电脑,需要机箱、显示器、键盘、鼠标,但是它们选取的品牌各异,最终的电脑价格和性能又是天差地别。
而这样的根据相同的配件,不同的组装所产生出的具体的内容,就是建造者模式的具体实现,也就是将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

二、建造者模式的结构

1、抽象建造者(Builder)

它声明为创建一个产品对象的各个部件指定的抽象接口,在该接口中一般声明两类方法,一类方法是buildPatX(),他们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。

2、具体建造者(ConcreteBuilder)

实现抽象建造者接口,构建和装配各个部件,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。

3、指挥者(Director)

它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()构造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者setter方法将该对象传入指挥者类中。它主要是用于创建一个复杂对象,它主要有两个作用①隔离了客户与对象的生成过程②负责控制产品对象的生产过程。

4、产品(Product)

产品角色,一个具体的产品对象。

三、建造者模式的优缺点

1、优点

  1. 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
  2. 每一个具体建造者都相对独立,而与其它的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”。
  3. 可以更加精细的控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。

2、缺点

  1. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此其使用范围受到一定的限制。
  2. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。

四、违背原则方案

比如你想组装一个电脑,需要机箱、显示器、键盘、鼠标。

1、电脑接口

package com.guor.builder;public interface Computer {// 电脑配件(主机、显示器、键盘、鼠标)String parts();// 品牌String brand();// 型号String model();// 价格Double price();// 描述String desc();
}

2、主机

(1)ROG主机

package com.guor.builder;public class RogHost implements Computer{@Overridepublic String parts() {return "主机";}@Overridepublic String brand() {return "ROG";}@Overridepublic String model() {return "光刃G15";}@Overridepublic Double price() {return 13999.00;}@Overridepublic String desc() {return "Intel i7-12700 16G 1TB+1TSSD RTX3070 8G独显";}
}

(2)拯救者主机

package com.guor.builder;public class LegionHost implements Computer {@Overridepublic String parts() {return "主机";}@Overridepublic String brand() {return "Lenovo";}@Overridepublic String model() {return "拯救者刃7000K";}@Overridepublic Double price() {return 6999.00;}@Overridepublic String desc() {return "Intel i5-12400F 16G 512G SSD RTX3060";}
}

3、显示器

(1)ROG32寸显示器

package com.guor.builder;public class Rog32Monitor implements Computer{@Overridepublic String parts() {return "显示器";}@Overridepublic String brand() {return "ROG";}@Overridepublic String model() {return "华硕PG32UG";}@Overridepublic Double price() {return 7499.00;}@Overridepublic String desc() {return "32寸 游戏显示器4K 144Hz HDR600";}
}

(2)ROG27寸显示器

package com.guor.builder;public class Rog27Monitor implements Computer {@Overridepublic String parts() {return "显示器";}@Overridepublic String brand() {return "ROG";}@Overridepublic String model() {return "华硕XG276Q";}@Overridepublic Double price() {return 1899.00;}@Overridepublic String desc() {return "27寸 电竞显示器 170Hz HDR400";}
}

(3)三星显示器

package com.guor.builder;public class SamsungMonitor implements Computer {@Overridepublic String parts() {return "显示器";}@Overridepublic String brand() {return "三星";}@Overridepublic String model() {return "三星S27R350FHC";}@Overridepublic Double price() {return 999.00;}@Overridepublic String desc() {return "27寸 IPS 便携显示器 75HZ";}
}

4、键盘

(1)ROG机械键盘

package com.guor.builder;public class RogKeyboard implements Computer {@Overridepublic String parts() {return "键盘";}@Overridepublic String brand() {return "ROG";}@Overridepublic String model() {return "龙骑士2";}@Overridepublic Double price() {return 1899.00;}@Overridepublic String desc() {return "机械键盘 双模 可分离式 104键 RGB背光 RX光轴";}
}

(2)罗技机械键盘

package com.guor.builder;public class LogitechKeyboard implements Computer {@Overridepublic String parts() {return "键盘";}@Overridepublic String brand() {return "Logitech";}@Overridepublic String model() {return "G610";}@Overridepublic Double price() {return 479.00;}@Overridepublic String desc() {return "cherry机械键盘 有线 104键 电竞游戏背光";}
}

5、鼠标

(1)ROG鼠标

package com.guor.builder;public class RogMouse implements Computer {@Overridepublic String parts() {return "鼠标";}@Overridepublic String brand() {return "ROG";}@Overridepublic String model() {return "战刃3";}@Overridepublic Double price() {return 599.00;}@Overridepublic String desc() {return "无限版 三模鼠标 RGB灯效可换微动26000DPI";}
}

(2)罗技鼠标

package com.guor.builder;public class LogitechMouse implements Computer {@Overridepublic String parts() {return "鼠标";}@Overridepublic String brand() {return "Logitech";}@Overridepublic String model() {return "G402";}@Overridepublic Double price() {return 199.00;}@Overridepublic String desc() {return "有线鼠标 高速追踪FPS";}
}

6、组装电脑

package com.guor.builder;import java.util.ArrayList;
import java.util.List;public class PackageComputer {public static String getComputerList(String name, Integer grade) {// 配件清单List<Computer> list = new ArrayList<Computer>();// 组装价格Double price = 0.00;// ROG套装if(grade == 1){RogHost host = new RogHost();Rog32Monitor monitor = new Rog32Monitor();RogKeyboard keyboard = new RogKeyboard();RogMouse mouse = new RogMouse();list.add(host);list.add(monitor);list.add(keyboard);list.add(mouse);price = host.price()+monitor.price()+keyboard.price()+mouse.price();}else if(grade == 2){// ROG机箱 + 27寸显示器 + 罗技键鼠RogHost host = new RogHost();Rog27Monitor monitor = new Rog27Monitor();LogitechKeyboard keyboard = new LogitechKeyboard();LogitechMouse mouse = new LogitechMouse();list.add(host);list.add(monitor);list.add(keyboard);list.add(mouse);price = host.price()+monitor.price()+keyboard.price()+mouse.price();}else if(grade == 3){// Legion机箱 + 三星显示器 + 罗技键鼠LegionHost host = new LegionHost();SamsungMonitor monitor = new SamsungMonitor();LogitechKeyboard keyboard = new LogitechKeyboard();LogitechMouse mouse = new LogitechMouse();list.add(host);list.add(monitor);list.add(keyboard);list.add(mouse);price = host.price()+monitor.price()+keyboard.price()+mouse.price();}StringBuilder builder = new StringBuilder();builder.append(name+"组装电脑:\r\n");builder.append("套餐:" + grade + "\r\n");builder.append("套餐价格:" + price + " 元\r\n");builder.append("配件清单:\r\n");for (Computer computer : list) {builder.append(computer.parts()+"、");builder.append(computer.brand()+"、");builder.append(computer.model()+"、");builder.append(computer.price()+"、");builder.append(computer.desc()+ "\r\n");}System.out.println("************************");return builder.toString();}public static void main(String[] args) {System.out.println(getComputerList("哪吒",1));System.out.println(getComputerList("敖丙",2));System.out.println(getComputerList("妲己",3));}
}

7、控制台显示

哪吒哥,不差钱!

这代码写的没毛病,根据选择的套餐等级,组装不同配置的电脑,无脑ROG就是爽!

五、建造者模式改善代码

1、电脑接口

组装一个电脑,需要主机、显示器、键盘、鼠标。

package com.guor.builder;public interface IComputer {// 主机IComputer appendHost(Computer computer);// 显示器IComputer appendMonitor(Computer computer);// 键盘IComputer appendKeyboard(Computer computer);// 鼠标IComputer appendMouse(Computer computer);// 电脑清单String getComputerDetail();
}

2、组装电脑实现类

package com.guor.builder;import java.util.ArrayList;
import java.util.List;public class BuilderComputer implements IComputer {// 配件清单private List<Computer> list = new ArrayList<Computer>();// 组装价格private Double price = 0.00;// 姓名private String name;// 套餐private int grade;public BuilderComputer(String name, int grade) {this.name = name;this.grade = grade;}@Overridepublic IComputer appendHost(Computer computer) {list.add(computer);price += computer.price();return this;}@Overridepublic IComputer appendMonitor(Computer computer) {list.add(computer);price += computer.price();return this;}@Overridepublic IComputer appendKeyboard(Computer computer) {list.add(computer);price += computer.price();return this;}@Overridepublic IComputer appendMouse(Computer computer) {list.add(computer);price += computer.price();return this;}@Overridepublic String getComputerDetail() {StringBuilder builder = new StringBuilder();builder.append(name+"组装电脑:\r\n");builder.append("套餐:" + grade + "\r\n");builder.append("套餐价格:" + price + " 元\r\n");builder.append("配件清单:\r\n");for (Computer computer : list) {builder.append(computer.parts()+"、");builder.append(computer.brand()+"、");builder.append(computer.model()+"、");builder.append(computer.price()+"、");builder.append(computer.desc()+ "\r\n");}System.out.println("************************");return builder.toString();}
}

3、建造者方法

package com.guor.builder;public class Builder {public IComputer levelOne(){return new BuilderComputer("哪吒",1).appendHost(new RogHost()).appendMonitor(new Rog32Monitor()).appendKeyboard(new RogKeyboard()).appendMouse(new RogMouse());}public IComputer levelTwo(){return new BuilderComputer("敖丙",2).appendHost(new RogHost()).appendMonitor(new Rog27Monitor()).appendKeyboard(new LogitechKeyboard()).appendMouse(new LogitechMouse());}public IComputer levelThree(){return new BuilderComputer("妲己",3).appendHost(new LegionHost()).appendMonitor(new SamsungMonitor()).appendKeyboard(new LogitechKeyboard()).appendMouse(new LogitechMouse());}public static void main(String[] args) {Builder builder = new Builder();System.out.println(builder.levelOne().getComputerDetail());System.out.println(builder.levelTwo().getComputerDetail());System.out.println(builder.levelThree().getComputerDetail());}
}

4、控制台显示

与上面结果一致。

去掉了繁琐的ifelse,符合单一职责原则、开闭原则,代码可读性、复用性、拓展性强。

很多人觉得设计模式很简单,但是,能够熟练的将设计模式应用在自己的项目中,将各模块、功能规划的井井有条,运用的炉火纯青、恰到好处,真的很难。反复阅读,仔细体会。

设计模式系列文章:

java设计模式1,单一职责原则

java设计模式2,开闭原则

java设计模式3,里氏替换原则

java设计模式4,不要和陌生人说话

java设计模式5,接口隔离原则

Java设计模式6,依赖倒置原则

java设计模式7,工厂方法模式

Java设计模式8,校验、审批流程改善神器,责任链模式

一篇打通架构设计,Java设计模式9,模板方法模式

Java设计模式10,建造者模式相关推荐

  1. java设计模式之建造者模式(UML类图分析+代码详解)

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

  2. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  3. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  4. java设计模式 建造模式_理解java设计模式之建造者模式

    理解java设计模式之建造者模式 发布于 2020-12-10| 复制链接 摘记: 建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中&qu ...

  5. JAVA设计模式之建造者模式

    转自 JAVA设计模式之建造者模式 建造者模式(Builder)的定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂对象的创建型 ...

  6. 一文弄懂Java设计模式之建造者模式:图解+游戏角色生成实例

    文章目录 详解Java设计模式之建造者模式 案例引入建造者模式 建造者模式 定义 UML类图表示 模式结构 案例分析与代码实现 案例类图实现 代码结构 代码实现 结果分析 指挥者类的深入讨论 钩子方法 ...

  7. Java设计模式之建造者模式(精髓版)

    目录 1.建造者模式阐述 2.使用Java代码实现建造者模式 3.为什么需要使用建造者模式? 4.建造者模式与工厂方法模式有什么区别? 1.建造者模式阐述 Java 建造者模式是一种创建型设计模式,其 ...

  8. (设计模式四)java设计模式之建造者模式

    建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 1.解决的问题 平常一般创建对象,需要new,然后通过set方法给每个属性设置,当创建多个对象的时候,代码重复性 ...

  9. 【Java设计模式】建造者模式(案例详解)

    [辰兮要努力]:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端.后台.数据 ...

  10. 【Java设计模式】建造者模式、原型模式

    建造者模式 (1)需要建造很多零件 (2)需要装配起来 通常用于构建一些复杂的对象.可能需要和工厂模式互相搭配. • 场景: – 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品 ...

最新文章

  1. linux 配置 clang++ SDL 开发环境 (新手向)
  2. 待办事项桌面插件_求一款安卓手机上可添加小目标的桌面便签软件?
  3. jeesite1.X 集成多数据源
  4. java异常标记_java.lang.RuntimeException:错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:错误的标记...
  5. synchronized原理_浅谈synchronized的实现原理
  6. flask v0.1 flask.py
  7. 通过一个Thinkphp完成多个项目
  8. 一个查看Access数据库密码的工具
  9. 注册表服务器设置mtu,自己修改注册表优化宽带网设置
  10. 求助:CISCO2811DHCP中继配置
  11. 新浪igame连连看游戏截图
  12. 计算机专硕都是数二英二吗,【专硕初试】大改革?英二、数二都不考了?
  13. 4年产品点滴心路——谈谈形而上的3个产品素质
  14. 停车场计费算法 php,时段计费算法,一般用于停车计费
  15. android edittext怎样获取输入的内容,如何获取edittext中输入的内容?
  16. 关于搭建FTP服务器
  17. 在Java中打印金字塔图案
  18. 解决 Performing stop of activity that is not resumed 报错!!
  19. Html5面试问题总结(精华)
  20. echarts折线图鼠标悬浮竖线_Echarts折线图问题,鼠标悬停的地方不能正确展示数据怎么回事呢?...

热门文章

  1. docker看远程仓库镜像_查看Docker镜像仓库中镜像的所有标签
  2. 计算机设计大赛感言,计算机设计大赛感言
  3. 科学计算机怎么按年金计算,普通年金终值计算器
  4. 通过分母有理化求根式的值
  5. 高数-极限-求极限值--有理化、多项式
  6. 向量的乘法,包括点乘与叉乘
  7. DC-DC电源转换电路设计
  8. 没有U盘电脑如何使用本地硬盘安装Ubuntu20.04(双系统)
  9. 虚拟机映射、虚拟机与物理机共享文件夹
  10. 1.1云存储技术的起源与发展