建造者模式

从拆箱到跑通:Intel RealSense D435i开箱实测+ROS驱动配置全流程 本文详细记录了Intel RealSense D435i深度相机的开箱体验,并提供了在Ubuntu 22.04与ROS2 Humble环境下,从安装librealsense2 SDK到配置ROS2驱动的完整流程。重点解决了驱动安装、数据流发布、点云对齐以及IMU数据融合等关键步骤,帮助研究者和开发者快速实现D435i与机器人系统的集成。 阅读详情

介绍

建造者模式又称生成器模式,顾名思义是用来建造或生成某个产品的,当然它与工厂模式的“生成”意义不同。工厂模式并没有考虑产品的生产细节,主要考虑的是多个产品如何生成;而建造者模式主要考虑某个产品具体如何实现,将一个复杂对象的构建与它的表示分离(将产品的创建细节与这个产品的使用分离),使得同样的构建过程可以创建不同的表示

具体实现

角色划分

Builder:生成器接口,定义创建一个Product对象所需的各个部件的操作

ConcreteBuilder:具体的生成器实现,实现各个部件的创建,同时还提供一个让用户获取组装完成后的产品对象的方法

Director:指导者,也被称为导向者,主要用来使用Builder接口,以一个统一的过程来构建所需要的Product对象

Product:产品,表示被生成器构建的复杂对象,包含多个部件

代码实现

Builder抽象类

public abstract class HouseBuilder {
    protected House house = new House();

    public abstract House buildHead(String head);

    public abstract House buildBody(String body);

    public abstract House buildFoot(String foot);

    public abstract House getHouse();
}

ConcreteBuilder具体建造类

public class CommonHouseBuilder extends HouseBuilder {

    private static final String TAG = "普通";

    @Override
    public House buildHead(String head) {
        house.setHead(TAG + head);
        return house;
    }

    @Override
    public House buildBody(String body) {
        house.setBody(TAG + body);
        return house;
    }

    @Override
    public House buildFoot(String foot) {
        house.setFoot(TAG + foot);
        return house;
    }

    @Override
    public House getHouse() {
        return house;
    }
}
public class VillaHouseBuilder extends HouseBuilder {

    private static final String TAG = "别墅";

    @Override
    public House buildHead(String head) {
        house.setHead(TAG + head);
        return house;
    }

    @Override
    public House buildBody(String body) {
        house.setBody(TAG + body);
        return house;
    }

    @Override
    public House buildFoot(String foot) {
        house.setFoot(TAG + foot);
        return house;
    }

    @Override
    public House getHouse() {
        return house;
    }
}

Director

public class HouseDirector {

    private HouseBuilder builder;

    public void setHouseBuilder(HouseBuilder builder) {
        this.builder = builder;
    }

    public House makeHouse(String head, String body, String foot) {
        this.builder.buildHead(head);
        this.builder.buildBody(body);
        this.builder.buildFoot(foot);
        return this.builder.getHouse();
    }
}

Product

public class House {
    private String head;
    private String body;
    private String foot;

    public String getHead() {
        return head;
    }

    public void setHead(String head) {
        this.head = head;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getFoot() {
        return foot;
    }

    public void setFoot(String foot) {
        this.foot = foot;
    }

    @Override
    public String toString() {
        return "House{" +
                "head='" + head + '\'' +
                ", body='" + body + '\'' +
                ", foot='" + foot + '\'' +
                '}';
    }
}

Client(用于测试的消费者)

public class Client {
    public static void main(String[] args) {
        HouseDirector director = new HouseDirector();
        director.setHouseBuilder(new CommonHouseBuilder());
        House house = director.makeHouse("房顶", "房体", "房基");
        System.out.println(house);

        director.setHouseBuilder(new VillaHouseBuilder());
        house = director.makeHouse("房顶", "房体", "房基");
        System.out.println(house);
    }
}

// 测试结果
// House{head='普通房顶', body='普通房体', foot='普通房基'}
// House{head='别墅房顶', body='别墅房体', foot='别墅房基'}

在这里插入图片描述

主要看实线部分即可

两种房子(普通房子和别墅房)分别由两种建造者生产产品的各部分(head,body,foot),在House类中是没有任何建造细节的,细节都留给builder去实现了,而Director专门负责实现将房子的三个部分拼装到一起

而大多数时候建造一个房子可能并没有这么复杂,或者不需要这么多角色都俱全,那这样写就有些鸡肋了,于是我们是可以对建造者模式进行简化的

  • 去除指导者Director:对于创建一个复杂的对象,可能会有很多种不同的选择和步骤,也就是说组装过程并不是唯一的,可能需要Client自己制定某些步骤,那么干脆去掉“指导者”,把指导者的功能和Client的功能合并起来,也就是说,Client这个时候就相当于指导者,它来指导构建器类去构建需要的复杂对象
  • 去除生成器接口:如果产品是唯一的,只需要创建某个具体的产品,那就没必要加一层抽象builder了

简化建造者模式

甚至直接把Builder作为House静态内部类,这样更为简洁,这种简洁方式在源码中极为常见,很是经典

House产品类

public class House {
    private String head;
    private String body;
    private String foot;

    public House(Builder builder) {
        this.head = builder.head;
        this.body = builder.body;
        this.foot = builder.foot;
    }

    @Override
    public String toString() {
        return "House{" +
                "head='" + head + '\'' +
                ", body='" + body + '\'' +
                ", foot='" + foot + '\'' +
                '}';
    }

    public static class Builder {
        private String head;
        private String body;
        private String foot;

        private static final String TAG = "普通";

        public Builder buildHead(String head) {
            this.head = TAG + head;
            return this;
        }

        public Builder buildBody(String body) {
            this.body = TAG + body;
            return this;
        }

        public Builder buildFoot(String foot) {
            this.foot = TAG + foot;
            return this;
        }

        public House build() {
            return new House(this);
        }
    }
}

Client

public class Test {
    public static void main(String[] args) {
        House house = new House.Builder()
                .buildHead("房顶")
                .buildBody("房体")
                .buildFoot("房基")
                .build();
        System.out.println(house);
    }
}

可能有些读者会有疑问,为何只剩一个Builder了还要写个静态内部类,直接在House类中写建造过程不香吗

那当然是不香了,建造者模式的目的就是将产品使用与产品创建分离,让使用者Client获得House后便不再使用这些方法,即“看不见”这些方法了,这样分离可以将House类的职责显得更为明确,House类的方法只是用来使用它的而不是用来创建它的

建造者模式优点

优点

  • 产品解耦:建造者模式可以用同一个构建算法构建出表现上完全不同的产品,实现产品构建和产品表现上的分离。生成器模式正是把产品构建的过程独立出来,使得建造过程十分清晰,使它和具体产品的表现松散耦合,从而使得构建算法可以复用,而具体产品表现也可以灵活地、方便地扩展和切换
  • 很容易改变产品的内部表示:由于Builder对象只是提供接口给Director使用,那么具体的部件创建和装配方式是被Builder接口隐藏了的,Director并不知道这些具体的实现细节。这样一来,要想改变产品的内部表示,只需要切换Builder的具体实现即可,不用管Director,因此变得很容易
  • 更好的复用性:生成器模式很好地实现了构建算法和具体产品实现的分离。这样一来,使得构建产品的算法可以复用。同样的道理,具体产品的实现也可以复用,同一个产品的实现,可以配合不同的构建算法使用

选用时机

  • 如果创建对象的算法,应该独立于该对象的组成部分以及它们的装配方式时
  • 如果同一个构建过程有着不同的表示时
源码实践

建造者模式的源码使用有StringBuilder,听名字就知道是个建造者模式,由于StringBuilder的建造过程与产品使用都需要提供给用户决定,所以产品类与Builder类是一个类,这样看StringBuilder其实并不是很符合建造者模式,但设计模式不能一棒子打死嘛,规矩是人定的,改装后的设计更好当然是可以改装的

在我工厂模式博客中工厂模式源码分析举的例子Calendar类也是建造者模式,而且是建造者模式与工厂模式结合

还有一个okhttp3中的Request类就是一个标准的简化建造者模式,与上述的代码如出一辙;再如SqlSessionFactory与SqlSessionFactoryBuilder这一组也是标准的建造者模式

Flatten 层的深度理解与运用 阅读详情

相关推荐

论文阅读笔记---Deep HDR Video from Sequences with Alternating Exposures

Kalantari N K, Ramamoorthi R. Deep HDR Video from Sequences with Alternating Exposures[C]//Computer Graphics Forum. 2019, 38(2): 193-205. 摘要: 在本文中,提出了一种基于学习的方法来,我们使用两个顺序卷积神经网络(CNN)对整个HDR视频重建过程进...

qq_25283239的博客 1447

设计模式—建造者模式及实例(BuilderPattern)

建造者模式(Builder Pattern)也称生成器模式,它属于创建型模式。

小嵩的博客 4002

手把手教你用u-center配置ublox GPS模块:从波特率到报文频率全流程

本文提供了一份详细的u-center软件配置ublox GPS模块的完整指南。从硬件连接到软件设置,逐步讲解了如何探测并设置正确的波特率、选择与启用关键的NMEA和UBX报文,以及配置输出频率。文章特别强调了配置固化的重要性,并分享了使用UBX协议进行高效数据解析等高级技巧,帮助开发者快速上手并优化GPS模块性能。

weixin_28285943的博客 897

建造者模式BuilderPattern

建造者模式BuilderPattern建造者模式简介应用场景:优点:缺点:典型例子:装配电脑。建造者模式结构:四大类产品类抽象建造者类具体建造者类指挥部类 建造者模式简介 一件产品/一个事物,由多个部件组成,这些部件可以自由替换,每个部件都有自己的创建过程,那么需要这个产品的客户端(使用者)可以忽略每个部件的创建过程,或者说使用者不关心你产品每个部件是如何产生的,你只要给我完整的产品就行,至于你各部件怎么建的、建好后又是如何装配成完整产品的,那是你的事,别特么让我知道,我嫌烦。 应用场景: (1) 需要生成

diezhongbing1358的博客 293

从GitHub到海浪模拟:手把手教你配置WAVEWATCHⅢ 6.07.0的完整开发与测试环境

本文详细指导如何在Ubuntu系统中配置WAVEWATCHⅢ 6.07.0的开发与测试环境,涵盖虚拟机设置、依赖安装、源码编译及案例验证的全流程。通过步骤化教程,帮助科研人员快速搭建高效的海浪模拟平台,提升海洋数值模拟的研究效率。

weixin_42568801的博客 325

GIS小白也能看懂的实战:5步教你将ArcGIS里的等高线和水系完美导入CAD做规划图

本文详细介绍了如何将ArcGIS中的等高线和水系数据高效导入CAD,制作专业规划底图的5个关键步骤。从数据准备、ArcGIS处理到CAD优化,涵盖坐标系设置、数据裁剪、格式转换等实用技巧,特别适合设计规划领域的新手快速掌握GIS与CAD协同工作流程。

weixin_27966471的博客 426

建造者模式(BuilderPattern)

原文参考出处:https://blog.youkuaiyun.com/u010102390/article/details/80179754 介绍: 建造者模式:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可...

静风落叶的博客 221

Proteus仿真实战:基于IIC驱动SSD1306的0.96英寸OLED显示方案解析

本文详细解析了在Proteus仿真环境中基于IIC驱动SSD1306的0.96英寸OLED显示方案。从硬件搭建、IIC接口连接、软件驱动移植到常见问题排查,提供了全面的实战指导,帮助开发者快速实现OLED显示功能并优化性能。

weixin_28724661的博客 772

设计模式之建造者模式(BuilderPattern)

一.意义 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 说明:复杂对象的构建,比如一个对象有几十个成员属性,那么我们在创建这个对象,并给成员属性赋值时,就会很麻烦。采用建造者模式,就是把创建对象并给成员属性赋值的工作,分离出来,由建造者角色来完成,业务程序员直接调用导演类,获得复杂对象即可,无需再进行对象的创建工作了。 二.角色 建造者模式涉及到一下几种角色: Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方

敲代码的小小酥的博客 415

2 海康视觉平台VisionMaster 上手系列:大纲及准备

海康视觉平台VisionMaster 大纲,课前准备 快速入门 工业机器视觉 机器视觉

HuangGong2022的博客 1万+

BookSim2.0 教程

本文是yz关于BookSim2.0的个人学习经验与教程。 1.介绍 什么是BookSim2.0 BookSim2.0 是周期正确的互联网络模拟器(A Cycle-Accurate Interconnection Network Simulator),被设计用来伴随William James Dally 等人出版的的书籍 Principles and Practices of INterconnection on Networks使用。 此后其功能不断得到扩展。当前的主要版本 BookSim 2.0 支持广泛

更新一些计算机体系架构NoC,GEM5, AXI4,还有machine learning 的日常 5737

设计模式——建造者模式(BuilderPattern)

建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 UML图:

雪夜&流星的专栏 571

稳定性性能系列之五——Native Crash深度分析:工具实战

深入理解Native Crash的机制与分析方法,掌握addr2line、ndk-stack、gdb等核心工具的实战使用,学会从Tombstone文件中快速定位问题根因

Cheson的专栏 1548

设计模式之建造者模式BuilderPattern(七)

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。@Data:这是Lombok中提供的Getter和Setter方法和toString方法的注解。@AllArgsConstructor:这是Lombok中提供的包含所有参数的构造方法注解。@NoArgsConstructor:这是Lombok中提供的不包含任何参数的构造方法注解。3、OrderBuilder类。1、OrderItem类。

徐泗空的博客 1331

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

设计模式建造者模式(BuilderPattern)

核心模块:Builder抽象建造者、ConcreteBuilder具体建造者、Product产品角色、Director指挥者 所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git 使用场景:构建复杂对象,或者构件过程中需要强制的分布措施; 优点:客户可以精细的控制构建过程,将产品创建过程和产品本省分离,细节依赖于

didiao11300的专栏 293

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

您的设计模式——建造者模式【Builder Pattern】

又是一个周三,快要下班了,老大突然又拉住我,喜滋滋的告诉我“牛叉公司很满意我们做的模型, 又签订了一个合同,把奔驰、宝马的车辆模型都交给我我们公司制作了,不过这次又额外增加了一个新需 求:汽车的启动、停止、喇叭声音、引擎声音都有客户自己控制,他想什么顺序就什么顺序,这个没问题 吧?”。 看着老大殷切的目光,我还能说啥,肯定的点头, “没问题! ” ,加班加点做呗, “再苦再累就当自己二 百

454

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

设计模式——建造者模式

又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。2)、构造者模式,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。3)、构造者模式主要解决在软件系统中,当面临一个复杂对象的创建工作时,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临剧烈的变化,但是将它们组合在一起的算法却相对稳定。

程序猿进阶 1773

生成器模式/建造者模式(BuilderPattern)

生成器模式/建造者模式(BuilderPattern):通过多个简单对象累积逐步构建成目标复杂的对象。这种设计模式属于创建型模式,提供创建对象的某种方式。 生成器模式/建造者模式的使用:在软件系统中有时候面临”某个极端复杂的对象"的创建需求,其通常由各个部分的子对象(部件对象)采用一定的算法构成;由于极端复杂需求的变化,这个极端复杂对象的各个部分经常面临着剧烈的变化,但是将各个部件组合在一起的逻辑算法却相对稳定。 基本的部件对象本身不会变但部件的组合经常变化时。 生成器(建造者)模式优点:建造者独立,易扩展

yanhaijunyan的博客 281

设计模式实现(四)建造者模式

1.什么是建造者模式(Builder Pattern) 建造者模式(Builder Pattern)又叫生成器模式,是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象,从而达到代码复用性。 建造者模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。 2.建造者模式的优点 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。 用户只需要给出指定复杂对象的类型和内容; 建造

WormholeStack 1279

JAVA设计模式之建造者模式详解

建造者模式(builder pattern), 也被称为生成器模式, 是一种创建型设计模式.定义: 将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。**建造者模式要解决的问题 **建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。

励志成为一名优秀的全能型软件开发工程师。 4282

设计模式之建造者模式【BuilderPattern】

    建造者模式属于创建型模式的一种。建造者模式主要是用于创建一个复杂的对象。使相同的创建过程可以创建不同的对象。建造者模式提供了一种创建对象的最优模式。建造者模式主要用于创建复合对象,复合对象就是某个类具有不同的属性。在一个对象的每一部分经常变化,但是将每一个对象组合起来的算法方式不变化的情况下使用建造者模式再合适不过。 话不多说,接下来看下建造者模式的实现类图: 先看下接口Ite...

董先生的远方 208

【设计模式从青铜到王者】第八篇:创建型模式之建造者模式(BuilderPattern)

系列文章目录 前言 建一栋房子总共分几步?建造者模式告诉你答案! 1.建造者模式简介 2.建造者模式结构 3.建造者模式代码实例 3.1.定义产品类House 3.2.定义建造者 3.2.1.定义抽象建造者AbstractBuilder 3.2.2.定义具体建造者 3.3.定义指挥者 3.4.客户端代码示例 3.5.效果 4.建造者模式总结 优点: 缺点: 适用环境: 总结...

森明帮大于黑虎帮的博客 345

建造者模式(BuilderPattern)

基本介绍:    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.作用:    在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。用户只需要给出指定复杂对象的类型和内容, 建造者模式负责按顺序创建复杂对象.package org.brando; /** * * 类说明: 测试类 * @author Brando 2018年3月29日 下午2:03...

BrandoLv 178
上一篇: 【前缀和】和为k的连续子数组
下一篇: Redis数据结构
荼锦AI编程
博客等级 码龄7年 198粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值