建造者模式

不只是CPU主频:深入解析英飞凌Aurix TC3xx各外设时钟树(CAN、以太网、Flash时序如何配置) 本文深入解析英飞凌Aurix TC3xx系列微控制器的外设时钟树配置,涵盖CAN、以太网和Flash时序的优化方法。通过详细分析时钟系统架构、关键外设配置及多外设协同设计策略,帮助工程师实现高性能汽车电子控制单元(ECU)开发。特别关注系统时钟的灵活配置与EMC优化技巧,提升系统实时性和可靠性。 阅读详情

介绍

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

具体实现

角色划分

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这一组也是标准的建造者模式

comfyui利用 SkyReels-V2直接生成长视频本地部署问题总结 2 :寻找丢失的model 和工作流中 get set 方法的应用 寻找丢失的model 和工作流中 get set 方法的应用,为什么有写工作流 中有很多断掉的节点,没有相互链接? 阅读详情

相关推荐

LabVIEW安装NI-DAQmx的方法(适合2021版和2022版)

LabVIEW安装NI-DAQmx的方法(适合2021版和2022版)

qq_65101190的博客 2万+

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

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

小嵩的博客 4002

OpenFeign, Zuul, Gateway相互不兼容的问题总结

版本 Lib Vresion spring-cloud-starter-gateway 3.1.0 spring-cloud-dependencies 2021.0.0 spring-cloud-starter-netflix-zuul 2.2.6.RELEASE spring-cloud-starter-openfeign 3.1.0 1. Zuul 与OpenFeign 一起使用的问题 错误信息 jav.

Harry的博客 4132

建造者模式BuilderPattern

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

diezhongbing1358的博客 293

RK3568—基于GM8775C的MIPI转双通道LVDS屏幕调试

Rockchip RK3568 原生显示接口不支持双通道LVDS屏幕的数据输出,因此需要借助显示转换芯片才能实现双通道LVDS屏幕的驱动。本文介绍使用GM8775C芯片方案,在 RK3568 平台实现单路 MIPI DSI 信号输出来驱动双通道LVDS显示屏。 关于GM8775C GM8775C 型 DSI 转双通道 LVDS 发送器产品主要实现将 MIPI DSI 转单/双通道 LVDS功能,MIPI 支持 1/2/3/4 通道可选,每通道最高支持 1Gbps 速率,最大支持 4Gbps 速率。LV.

Industio_优快云的博客 1万+

2025小红书跳转卡片实战指南:从零搭建独立后台与自动化发卡系统

本文提供了一份2025年小红书跳转卡片的实战搭建指南,详细解析了独立后台系统的核心架构与自动化发卡流程。文章从零开始,手把手教你使用Node.js、Vue.js等技术栈构建包含后台管理、用户制卡中心与前端交互的完整系统,旨在帮助运营者实现合规引流,并掌握数据自主权与自动化运营能力。

weixin_29234423的博客 518

建造者模式(BuilderPattern)

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

静风落叶的博客 221

防火墙断网后Adobe软件还弹窗“THIS APP HAS BEEN DISABLED”?原来是科学上网导致的问题!用这个简单方法一键解决!

很多小伙伴在使用上网工具的时候时,突然遇到Adobe弹出“THIS APP HAS BEEN DISABLED”的烦人提示,这个非正版弹窗真的让人头疼!即使你之前尝试过,有时也不奏效,究其原因,原来是因为你使用了代理网络,这时Adobe的流量并不是走本地,而是走代理,导致防火墙的拦截无效。不用慌!今天我来教大家如何通过上网工具,轻松禁用Adobe验证的联网流量,彻底解决这个问题!

qq_34093397的博客 3万+

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

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

敲代码的小小酥的博客 415

9.9华为OD机试真题 新系统 - 受限任务分配 (Java/Py/C/C++/Js/Go)

华为OD机试真题 新系统【受限任务分配】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【受限任务分配】多语言题解。

qq_45776114的博客 734

Q3D提取PCB走线RLCG参数

介绍一种提取PCB走线寄生电容和寄生电感的方法

sinat_15150363的博客 2923

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

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

雪夜&流星的专栏 571

【软考】数据库系统工程师备考指南(一)

目录一、数据库系统工程师简介二、考试要求三、考试目标四、考试范围(一)信息系统知识(二)数据库系统设计与管理 一、数据库系统工程师简介 数据库系统工程师考试属于全国计算机技术与软件专业技术资格(水平)考试(简称计算机软件水平资格考试)中的一个中级考试。考试不设学历与资历条件,也不论年龄和专业,考生可根据自己的技术水平选择合适的级别合适的资格,但一次考试只能报考一种资格。考试采用笔试形式,考试实行全国统一大纲、统一试题、统一时间、统一标准、统一证书的考试办法。笔试安排在一天之内。 2022 年数据库系统工程

邓邓子的博客 3861

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

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

徐泗空的博客 1331

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

didiao11300的专栏 293

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

454

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

设计模式——建造者模式

又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。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、付费专栏及课程。

余额充值