建造者模式的运用 傷城~ 2024-03-16 14:20 46阅读 0赞 #### 文章目录 #### * 一、建造者模式的运用 * * 1.1 介绍 * 1.2 建造者模式结构 * 1.3 建造者模式类图 * 1.4 组装自行车案例 * * 1.4.1 组装自行车案例类图 * 1.4.2 代码 * 1.5 优缺点 * 1.6 使用场景 * 1.7 模式扩展 * * 1.7.1 原始代码 * 1.7.2 重构代码 ## 一、建造者模式的运用 ## ### 1.1 介绍 ### 将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 * **分离**了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。 * 由于实现了构建和装配的**解耦**。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是**实现了构建算法、装配算法的解耦**,实现了更好的复用。 * 建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。 ### 1.2 建造者模式结构 ### * **抽象建造者类**(Builder):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。 * **具体建造者类**(ConcreteBuilder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。 * **产品类**(Product):要创建的复杂对象。 * **指挥者类**(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。 ### 1.3 建造者模式类图 ### ![在这里插入图片描述][66e653796672498b90b739e31bff8a06.png_pic_center] ### 1.4 组装自行车案例 ### 生产自行车是一个复杂的过程,它包含了车架,车座等组件的生产。而车架又有碳纤维,铝合金等材质的,车座有橡胶,真皮等材质。对于自行车的生产就可以使用建造者模式。 #### 1.4.1 组装自行车案例类图 #### Bike是产品,包含车架,车座等组件;Builder是抽象建造者,MobikeBuilder和OfoBuilder是具体的建造者;Director是指挥者。 ![在这里插入图片描述][a6b6c5e5960e4eaf972607ffed2a6304.png_pic_center] #### 1.4.2 代码 #### /** * 产品: Bike */ public class Bike { private String frame;//车架 private String seat;//车座 public String getFrame() { return frame; } public void setFrame(String frame) { this.frame = frame; } public String getSeat() { return seat; } public void setSeat(String seat) { this.seat = seat; } } /** * 抽象建造者: Builder */ public abstract class Builder { //声明Bike类型的变量,并进行赋值 protected Bike bike = new Bike(); public abstract void buildFrame(); public abstract void buildSeat(); //构建自行车的方法 public abstract Bike createBike(); } /** * 具体的构建者,用来构建摩拜单车对象 */ public class MobileBuilder extends Builder { public void buildFrame() { bike.setFrame("碳纤维车架"); } public void buildSeat() { bike.setSeat("真皮车座"); } public Bike createBike() { return bike; } } /** * ofo单车构建者,用来构建ofo单车 */ public class OfoBuilder extends Builder { public void buildFrame() { bike.setFrame("铝合金车架"); } public void buildSeat() { bike.setSeat("橡胶车座"); } public Bike createBike() { return bike; } } /** * 指挥者 */ public class Director { //声明builder类型的变量 private Builder builder; public Director(Builder builder) { this.builder = builder; } //组装自行车的功能 public Bike construct() { builder.buildFrame(); builder.buildSeat(); return builder.createBike(); } } /** * 客户: Client */ public class Client { public static void main(String[] args) { //创建指挥者对象 Director director = new Director(new MobileBuilder()); //让指挥者只会组装自行车 Bike bike = director.construct(); System.out.println(bike.getFrame()); System.out.println(bike.getSeat()); } } ### 1.5 优缺点 ### **优点:** * 建造者模式的**封装性好**。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的**业务逻辑封装在指挥者类**中对整体而言可以取得比较好的**稳定性**。 * 在建造者模式中,客户端不必知道产品内部组成的细节,将**产品本身与产品的创建过程解耦**,使得相同的创建过程可以创建不同的产品对象。 * 可以**更加精细地控制产品的创建过程** 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。 * 建造者模式很**容易进行扩展**。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。符合开闭原则。 **缺点:** 造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。 ### 1.6 使用场景 ### 建造者(Builder)模式创建的是复杂对象,其产品的各个部分经常面临着剧烈的变化,但将它们组合在一起的算法却相对稳定,所以它通常在以下场合使用。 * 创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的**建造顺序是稳定的**。 * 创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即**产品的构建过程和最终的表示是独立的**。 ### 1.7 模式扩展 ### 建造者模式在开发中还有一个常用的使用方式,就是当一个类构造器需要传入很多参数时,如果创建这个类的实例,代码可读性会非常差,而且很容易引入错误,此时就可以利用建造者模式进行重构。 #### 1.7.1 原始代码 #### 在客户端代码中构建Phone对象,传递了四个参数,若参数更多的话,代码的可读性及使用的成本就会变得比较高。 /** * Phone的javaBean */ public class Phone { private String cpu; private String screen; private String memory; private String mainboard; public Phone(String cpu, String screen, String memory, String mainboard) { this.cpu = cpu; this.screen = screen; this.memory = memory; this.mainboard = mainboard; } public String getCpu() { return cpu; } public void setCpu(String cpu) { this.cpu = cpu; } public String getScreen() { return screen; } public void setScreen(String screen) { this.screen = screen; } public String getMemory() { return memory; } public void setMemory(String memory) { this.memory = memory; } public String getMainboard() { return mainboard; } public void setMainboard(String mainboard) { this.mainboard = mainboard; } @Override public String toString() { return "Phone{" + "cpu='" + cpu + '\'' + ", screen='" + screen + '\'' + ", memory='" + memory + '\'' + ", mainboard='" + mainboard + '\'' + '}'; } } /** * 客户: Client */ public class Client { public static void main(String[] args) { //构建Phone对象 Phone phone = new Phone("intel","三星屏幕","金士顿","华硕"); System.out.println(phone); } } #### 1.7.2 重构代码 #### 重构后的代码在使用起来更方便,某种程度上也可以提高开发效率。从软件设计上,对程序员的要求比较高。 /** * Phone的JavaBean */ public class Phone{ private String cpu; // 中央处理器 private String screen; // 屏幕 private String memory; // 存储器 private String mainboard; // 主板 // 构造私有的构造方法防止外界直接声明有参对象 private Phone(Builder builder){ this.cpu = builder.cpu; this.screen = builder.screen; this.memory = builder.memory; this.mainboard = builder.mainboard; } // 构建静态内部类Builder public static final class Builder { private String cpu; private String screen; private String memory; private String mainboard; public Builder cpu(String cpu) { this.cpu = cpu; return this; } public Builder screen(String screen) { this.screen = screen; return this; } public Builder memory(String memory) { this.memory = memory; return this; } public Builder mainboard(String mainboard) { this.mainboard = mainboard; return this; } // 使用构建者创建Phone对象 public Phone build() { return new Phone(this); } } @Override public String toString() { return "Phone{" + "cpu='" + cpu + '\'' + ", screen='" + screen + '\'' + ", memory='" + memory + '\'' + ", mainboard='" + mainboard + '\'' + '}'; } } /** * 客户: Client */ public class Client { public static void main(String[] args) { // 创建一个Phone对象,通过构建者对象获取Phone对象 Phone phone = new Phone.Builder() .cpu("天玑1000+ 八核") .screen("华为屏幕") .memory("金士顿内存条") .mainboard("华硕ROG MAXIMUS Z790 EXTREME") .build(); System.out.println(phone); } } `记录每一个学习瞬间` [66e653796672498b90b739e31bff8a06.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/16/302ccd9a200548ad8d9ac56922910f18.png [a6b6c5e5960e4eaf972607ffed2a6304.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/16/9f2d0c54240d466eb94a96fbc32c214c.png
相关 建造者模式的运用 文章目录 一、建造者模式的运用 1.1 介绍 1.2 建造者模式结构 1.3 建造者模式类图 1.4 组装自行 傷城~/ 2024年03月16日 14:20/ 0 赞/ 47 阅读
相关 建造者模式 定义 将一个复杂对象的构造与它的表示分离,是的同样的构建过程可以创建不同的表示。 类型:创建型 建造者模式与工厂模式有些类似: 建造者更注重:方法的调用顺序,关心创 「爱情、让人受尽委屈。」/ 2022年02月15日 19:25/ 0 赞/ 243 阅读
相关 建造者模式 [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] 1、产品类 package com.hhdys r囧r小猫/ 2022年01月14日 22:37/ 0 赞/ 209 阅读
相关 建造者模式 建造者模式,又称为生成器模式,是一种较为复杂、使用频率不高的创建型模式。它为客户端返回的不是一个简单的产品,而是有多个部件组成的复杂产品。以手机为例,建造者模式返回的是一个完整 谁践踏了优雅/ 2021年12月10日 18:29/ 0 赞/ 213 阅读
相关 建造者模式 建造者模式 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 柔光的暖阳◎/ 2021年09月29日 16:04/ 0 赞/ 289 阅读
相关 建造者模式之项目运用 1 问题 建造者模式,我们也许不陌生,因为我们看到很多开源框架或者Android源码里面用到,类似这样的代码结构 A a = new A.builder().m ゝ一世哀愁。/ 2021年09月24日 01:32/ 0 赞/ 135 阅读
相关 建造者模式 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Buil 向右看齐/ 2021年09月17日 01:24/ 0 赞/ 322 阅读
相关 建造者模式 建造者模式 1. 简介 2. 建造者模式介绍 2.1 定义 2.2 建造者模式的优点 2.3 建造者模式的缺点 ﹏ヽ暗。殇╰゛Y/ 2021年08月30日 22:18/ 0 赞/ 456 阅读
相关 建造者模式 一 点睛 将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naG 怼烎@/ 2021年07月24日 18:01/ 0 赞/ 389 阅读
相关 建造者模式 造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Bu... 小灰灰/ 2020年06月13日 05:36/ 0 赞/ 713 阅读
还没有评论,来说两句吧...