趣解建造者模式之网红小王购车记

简介: 趣解建造者模式之网红小王购车记

一、前言

本文章是关于设计模式中的建造者模式的,也称构建者模式/生成器模式,英文我们称之为Builder Pattern。在开展讲解之前,我们先把该模式的定义了解一下。

建造者模式的定义:

该模式可以实现产品的封装构造过程,并允许按步骤构造产品。

该模式的优点:

可以将一个复杂对象的创建过程封装起来,允许对象通过多个步骤来创建,并且可以改变过程;它也可以向客户隐藏产品内部的表现;因为客户只看到一个抽象接口,所以产品的具体实现是可以被替换的。

用途:

经常被用来创建组合结构。

缺点:

与工厂模式相比,采用生成器模式创建对象的客户,需要具备更多的领域知识。

二、讲个小故事

小王家境一般,但是呢,通过自己的努力成为了一个小网红,收入也逐渐多了起来。他从小就羡慕开汽车的人,所以,自己也决定买辆车。

他首先去了奥迪的4s店,车子很多,也很不错。4S店的销售人员给他介绍了很多车型,他看中了奥迪的A4L,各方面都挺喜欢的,然后就打算付款了。

正在这个时候,他的助理给他打电话,“小王!榜一大哥准备签约你了!签约费用给你1000万!你发达了!”,小王一听,高兴坏了,这不一下子鸡窝变凤凰了嘛!他挂断电话,觉得自己得买一辆更独特的汽车,而不是大街上较为常见的A4L了,然后他问销售人员,这个车我能自己定制不?销售人员说,我们只有一些选配项,定制不了。小王很失望,他太想拥有一辆“专属”自己的车子了。这个时候,销售人员建议他,去看一看保时捷,定制的项目非常多。然后呢,他就去了保时捷4s店,从那边他发现,从小的轮毂logo,再到外观中控,都能选配和定制,这就太好了,他选了好多自己喜欢的定制型,这样,一辆完完全全“专属”小王的保时捷跑车就定制好了。

三、模式的使用方式

从上面的例子我们可以看到,对于普通汽车来说,大多采用固定的一些配置项,我们获得的汽车往往没有特殊化定制的需求,那么这种情况,我们通过工厂方法或者抽象工厂就可以满足需求。

但是对于高端客户,往往需要定制化的东西比较多,那么创建出来的实例对象也更为复杂和灵活,对于这种场景,我们就可以通过Builder模式来进行对象的创建了。

所以,当我们需要自定义各种对象的细节部分,然后最终拼装出一个个性化实例对象时,就非常适合采用建造者模式。

获得一个车架子,拼装车门,拼装轮胎,拼装发动机,拼装变速箱……,然后获得最终的个性化汽车。

3.1> 类图

在通过上面的例子了解了建造者模式之后,我们就通过类图的方式,展示一下该模式。在下图中,我们提供了两种场景:分别是客户不可定制客户可以定制,具体选择哪种实现方式,可以根据具体的业务场景来自行选择:

3.2> 代码实现

创建一个汽车实体类Car,里面包含4个组件,分别是:汽车引擎(engine)、变速齿轮(gear)、车门(door)和汽车轮胎(wheel),代码如下所示:

@ToString
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Car {
    private String engine = "普通标准的发动机";
    private String gear = "普通标准的齿轮";
    private String door = "普通标准的车门";
    private String wheel = "普通标准的轮胎";
}

创建构造器接口Builder,提供安装引擎(initalEngine)、安装齿轮(initalGear)、安装车门(initalDoor)、安装轮胎(initailWheel)等功能:

public interface Builder {
    // 安装引擎
    Builder initalEngine(String engine);
    // 安装齿轮
    Builder initalGear(String gear);
    // 安装车门
    Builder initalDoor(String door);
    // 安装轮胎
    Builder initailWheel(String wheel);
    // 获得构建后的汽车
    Car getCar();
}

根据Builder接口,实现创建奥迪车的Builder实现类——AudiBuilder:

public class AudiBuilder implements Builder {
    private Car car;
    public AudiBuilder() {
        car = new Car("Audi普通的发动机",
                "Audi普通标准的齿轮",
                "Audi普通标准的车门",
                "Audi普通标准的轮胎");
    }
    @Override
    public Builder initalEngine(String engine) {
        car.setEngine(engine);
        return this;
    }
    @Override
    public Builder initalGear(String gear) {
        car.setGear(gear);
        return this;
    }
    @Override
    public Builder initalDoor(String door) {
        car.setDoor(door);
        return this;
    }
    @Override
    public Builder initailWheel(String wheel) {
        car.setWheel(wheel);
        return this;
    }
    @Override
    public Car getCar() {
        return car;
    }
}

根据Builder接口,实现创建宝马车的Builder实现类——BMWBuilder:

public class BMWBuilder implements Builder {
    private static Car car = new Car("BMW普通的发动机", 
                                     "BMW普通标准的齿轮", 
                                     "BMW普通标准的车门",
                                     "BMW普通标准的轮胎");
    @Override
    public Builder initalEngine(String engine) {
        car.setEngine(engine);
        return this;
    }
    @Override
    public Builder initalGear(String gear) {
        car.setGear(gear);
        return this;
    }
    @Override
    public Builder initalDoor(String door) {
        car.setDoor(door);
        return this;
    }
    @Override
    public Builder initailWheel(String wheel) {
        car.setWheel(wheel);
        return this;
    }
    @Override
    public Car getCar() {
        return car;
    }
}

创建工人类Worker,这个工人可以创建奥迪A4L型号汽车(createA4LCar)和奥迪R8跑车(createR8Car),也可以创建普通的宝马汽车(createCommonBMW):

public class Worker {
    Car createA4LCar() {
        return new AudiBuilder().
        initalEngine("Audi的4缸发动机").
        initalGear("6速双离合变速箱").getCar();
    }
    Car createR8Car() {
        return new AudiBuilder().
        initalEngine("16缸跑车引擎").
        initalDoor("碳纤维轻量级车门").
        initalGear("7档湿式双离合变速箱").
        initailWheel("米其林Top2竞速级轮胎").getCar();
    }
    Car createCommonBMW() {
        return new BMWBuilder().getCar();
    }
}

创建测试类BuilderTest,使得工人创建奥迪A4L、奥迪R8跑车和普通的宝马汽车:

public class BuilderTest {
    public static void main(String[] args) {
        Worker worker = new Worker();
        Car audiR8 = worker.createR8Car();
        Car audiA4L = worker.createA4LCar();
        Car commonBMW = worker.createCommonBMW();
        System.out.println("audiR8=" + audiR8);
        System.out.println("audiA4L=" + audiA4L);
        System.out.println("commonBMW=" + commonBMW);
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

相关文章
|
7月前
|
消息中间件 存储 Kafka
流、表与“二元性”的幻象
本文探讨流与表的“二元性”本质,指出实现该特性需具备主键、变更日志语义和物化能力。强调Kafka与Iceberg因缺乏更新语义和主键支持,无法真正实现二元性,唯有统一系统如Flink、Paimon或Fluss才能无缝融合流与表。
464 7
流、表与“二元性”的幻象
|
3月前
|
机器学习/深度学习 人工智能 编解码
视频字幕擦除与动态修复技术深度解析:从开源算法基准到高并发SaaS架构的演进
本报告深度解析视频硬字幕擦除与修复技术演进,涵盖光流传播、时空Transformer(如ProPainter)及扩散模型等前沿算法;对比开源工具、桌面软件与SaaS云平台,指出云端原生架构在算力解耦、热更新、高并发与易用性上的断代优势,为工业落地提供权威指南。
622 1
视频字幕擦除与动态修复技术深度解析:从开源算法基准到高并发SaaS架构的演进
|
4月前
|
人工智能 自然语言处理 安全
免费的BI产品推荐(2026年最新版)
2026年,瓴羊Quick BI成免费BI首选:永久免费基础版+30天高级试用;零代码操作,支持Excel/MySQL等多源接入;内置“智能小Q”AI助手,自然语言秒出图表与归因分析;国产安全合规,适配中小企、创业者及一线业务人员。让数据决策真正零门槛。
|
4月前
|
人工智能 自然语言处理 运维
企业建设智能客服系统要多少钱(2026年2月最新)
2026年智能客服成企业数字化标配,全球市场规模将超680亿美元。建设成本因部署模式(SaaS/专属云/私有化)、对话复杂度、渠道覆盖、系统集成、并发量及合规要求而异,年投入从2万元到150万元不等。科学规划预算、聚焦业务价值,方能实现高效ROI。(239字)
|
5月前
|
存储 人工智能 弹性计算
阿里云组合购2026最新套餐:精选云产品组合,覆盖90%上云场景,组合购更实惠
2026年阿里云组合购活动更新,涵盖AI建站、模型推理、热卖场景、建站部署等超值套餐。活动精选云产品组合,如39元AI建站赠.CN域名、百炼+ECS组合119元起、ECS+RDS MySQL 198元起等,组合购享专属折扣价。详细组合套餐配置及价格请看下文。
819 8
|
6月前
|
缓存 人工智能 开发者
大模型推理优化实战:从延迟到吞吐的工程权衡
在人工智能从“能用”迈向“好用”的关键阶段,大语言模型(LLM)的部署效率已成为产品落地的核心瓶颈。开发者常面临一个现实困境:模型在实验室跑得飞快,上线后却响应迟缓、成本飙升。本文将深入探讨大模型推理中的关键技术挑战与优化策略,帮助工程师在延迟(Latency)、吞吐量(Throughput)和成本之间找到最佳平衡点。
|
6月前
|
数据采集 DataWorks Cloud Native
云原生数据中台建设方案
本文系统阐述云原生数据中台建设方案,基于“采集-计算-治理-服务”四层架构,结合阿里云产品矩阵与零售行业实践,提供从数据整合、批流一体计算、质量安管到API服务输出的全链路指南,助力企业打破孤岛、实现数据资产化与业务价值转化。
414 0
|
机器学习/深度学习 人工智能 供应链
从概念到商业价值:AI、机器学习与深度学习全景指南
在这个科技飞速发展的时代🚀,人工智能正以惊人的速度渗透到我们的生活和工作中👀。但面对铺天盖地的AI术语和概念,很多人感到困惑不已😣。"AI"、"机器学习"、"深度学习"和"神经网络"到底有什么区别?它们如何相互关联?如何利用这些技术提升工作效率和创造价值?
663 0
|
8月前
|
监控 Kubernetes NoSQL
流量突然提升100倍QPS,怎么办?
面对流量暴增,系统易现吞吐下降、崩溃及雪崩效应。需通过压力测试、熔断降级、弹性扩容、监控预警与混沌工程等手段,提升系统稳定性与容错能力,确保高并发下关键业务持续可用。
|
人工智能 编解码 自然语言处理
DreamActor-M1:字节跳动推出AI动画黑科技,静态照片秒变生动视频
DreamActor-M1是字节跳动研发的AI图像动画框架,通过混合引导机制实现高保真人物动画生成,支持多语言语音驱动和形状自适应功能。
1068 40
DreamActor-M1:字节跳动推出AI动画黑科技,静态照片秒变生动视频