技术成神之路:设计模式(二)建造者模式

1.定义


建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象,而不必直接调用构造函数。建造者模式特别适合那些包含多个组成部分并且构造过程复杂的对象。

2. 结构


建造者模式的主要组成部分包括:

  • 产品(Product): 要创建的复杂对象。
  • 建造者(Builder): 用于创建产品各个部分的抽象接口。
  • 具体建造者(Concrete Builder): 实现Builder接口,构造和装配产品的各个部分。
  • 指挥者(Director): 负责管理建造过程,指导建造者如何构建产品。

3. 类图


在这里插入图片描述

4. 实现步骤


  • 定义产品类: 这类是要创建的复杂对象,包含多个部分。
  • 定义抽象建造者接口: 定义构建产品各部分的方法。
  • 实现具体建造者类: 实现接口,完成各部分的构建。
  • 定义指挥者类: 管理建造过程,使用建造者接口来创建产品。

5. 代码示例


// 产品类
class Computer {private String cpu;private String gpu;private int ram;private int storage;public void setCpu(String cpu) {this.cpu = cpu;}public void setGpu(String gpu) {this.gpu = gpu;}public void setRam(int ram) {this.ram = ram;}public void setStorage(int storage) {this.storage = storage;}
}// 抽象建造者
interface ComputerBuilder {void buildCPU();void buildGPU();void buildRAM();void buildStorage();Computer getResult();
}// 具体建造者
class GamingComputerBuilder implements ComputerBuilder {private Computer computer;public GamingComputerBuilder() {computer = new Computer();}@Overridepublic void buildCPU() {computer.setCpu("Intel i9");}@Overridepublic void buildGPU() {computer.setGpu("NVIDIA RTX 3080");}@Overridepublic void buildRAM() {computer.setRam(32);}@Overridepublic void buildStorage() {computer.setStorage(2000);}@Overridepublic Computer getResult() {return computer;}
}// 指挥者
class Director {private ComputerBuilder builder;public Director(ComputerBuilder builder) {this.builder = builder;}public Computer construct() {builder.buildCPU();builder.buildGPU();builder.buildRAM();builder.buildStorage();return builder.getResult();}
}// 客户端代码示例
public class Client {public static void main(String[] args) {// 创建具体建造者ComputerBuilder builder = new GamingComputerBuilder();// 创建指挥者并传入建造者Director director = new Director(builder);// 构建复杂对象Computer computer = director.construct();}
}

在上述示例中:

  • Computer 是要构建的复杂对象,包含了几个部件(CPU、GPU、RAM、存储)。
  • ComputerBuilder 是抽象建造者接口,定义了构建每个部件的方法。
  • GamingComputerBuilder 是具体建造者,实现了具体部件的构建方法。
  • Director 是指挥者,负责按照一定顺序调用具体建造者的方法来构建对象。
  • Client 是客户端代码,通过指挥者来构建复杂对象。

6. 建造者模式的变体


内部类建造者

在实际开发中,使用内部类建造者最为常见,大多数第三方库和安卓系统源码也都使用了建造者模式,主要是方便好用。

public class Car {private final String engine;private final String body;private final String wheels;private final String interior;private Car(Builder builder) {this.engine = builder.engine;this.body = builder.body;this.wheels = builder.wheels;this.interior = builder.interior;}public static class Builder {private String engine;private String body;private String wheels;private String interior;public Builder setEngine(String engine) {this.engine = engine;return this;}public Builder setBody(String body) {this.body = body;return this;}public Builder setWheels(String wheels) {this.wheels = wheels;return this;}public Builder setInterior(String interior) {this.interior = interior;return this;}public Car build() {return new Car(this);}}@Overridepublic String toString() {return "Car [Engine=" + engine + ", Body=" + body + ", Wheels=" + wheels + ", Interior=" + interior + "]";}public static void main(String[] args) {Car car = new Car.Builder().setEngine("V8 Engine").setBody("SUV Body").setWheels("Alloy Wheels").setInterior("Leather Interior").build();System.out.println(car);}
}

7. 建造者模式经典应用 AlertDialog.Builder 源码分析


在 Android 源码中,AlertDialog.Builder 类用于创建 AlertDialog 对象。它提供了一种链式调用的方式来设置对话框的各种属性,如标题、消息、按钮等。

核心成员变量

private final AlertController.AlertParams P;

PAlertController.AlertParams 的一个实例,用于存储和管理对话框的各种参数。

构造函数

public Builder(Context context) {P = new AlertController.AlertParams(new ContextThemeWrapper(context,resolveDialogTheme(context, 0 /* default theme */)));
}

在构造函数中,会创建一个 AlertController.AlertParams 对象,这个对象包含了对话框的参数设置。

设置标题和消息

public Builder setTitle(CharSequence title) {P.mTitle = title;return this;
}public Builder setMessage(CharSequence message) {P.mMessage = message;return this;
}

设置按钮

public Builder setPositiveButton(CharSequence text, final OnClickListener listener) {P.mPositiveButtonText = text;P.mPositiveButtonListener = listener;return this;
}public Builder setNegativeButton(CharSequence text, final OnClickListener listener) {P.mNegativeButtonText = text;P.mNegativeButtonListener = listener;return this;
}

这里的方法它们返回 Builder 对象自身,以支持链式调用。我们在自定义FragmentDialog的时候会经常用到。

创建对话框

 public AlertDialog create() {// Context has already been wrapped with the appropriate theme.final AlertDialog dialog = new AlertDialog(P.mContext, 0, false);P.apply(dialog.mAlert);dialog.setCancelable(P.mCancelable);if (P.mCancelable) {dialog.setCanceledOnTouchOutside(true);}dialog.setOnCancelListener(P.mOnCancelListener);dialog.setOnDismissListener(P.mOnDismissListener);if (P.mOnKeyListener != null) {dialog.setOnKeyListener(P.mOnKeyListener);}return dialog;}

create() 方法用于实际创建 AlertDialog 对象。在这里,会通过 AlertController.apply() 方法将 AlertParams 中的参数应用到 AlertDialog 中,并设置对话框的可取消性、监听器等。

使用示例

不是吧啊sir ,AlertDialog谁没用过啊,谁还看你的示例 。

好! 不写了 😊

8. 适用场景及优势


场景:

  • 构建和表示分离: 产品的构建过程和最终表示需要解耦。
  • 需要构建复杂对象: 产品包含多个部分,构建过程比较复杂。
  • 需要多个产品表示: 同样的构建过程可以创建不同的产品表示。

优势:

  • 灵活的对象构建: 可以根据需要调整构建过程,创建不同的产品表示。
  • 高度可读的代码: 通过分步骤构建对象,使代码更易于理解和维护。
  • 良好的扩展性: 可以轻松添加新的构建步骤或修改现有步骤,而不会影响客户端代码。

9. 结论


建造者模式是一种强大的设计模式,特别适合构建过程复杂的对象。它通过将对象的构建过程与表示分离,使得代码更具可读性和可维护性。同时,建造者模式还可以灵活地创建不同的产品表示。

建造者模式不难理解,记住好的代码都是重构出来的,设计模式也是,多写,多练才能真正掌握它的核心。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/865961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

朗新天霁eHR GetFunc_code.asmx SQL注入致RCE漏洞复现

0x01 产品简介 朗新天霁人力资源管理系统(LongShine eHR)是一款由北京朗新天霁软件技术有限公司研发的人力资源管理系统,该产品融合了国外先进的人力资源管理理念和国内大量人力资源管理实践经验,是国内功能较为全面、性价比较高的人力资源管理系统之一,系统凭借其集成化…

中国农业会计编辑部中国农业会计杂志社2024年第10期目录

人物风采 为民服务守初心 平凡岗位担使命——记云南省漾濞县畜牧兽医管理服务中心高级畜牧师徐健春 2 会计研究 管理会计在企业全面管理中的应用——以D公司为例 蒯浠语; 3-5,《中国农业会计》投稿:cnqikantg126.com AI时代企业会计数据集成管理策略研究…

MySQL单表千万级数据查询优化大家怎么说(评论有亮点)

题图来自APOD 上次写了一篇MySQL优化实战的文章“MySQL千万级数据从190秒优化到1秒全过程”。 这篇文章主要还是在实战MySQL优化,所以从造数据到查询SQL优化SQL都没有业务或者其它依赖,优化的技巧也不涉及软件架构就是纯SQL优化。 由于笔者经验有限和…

SQL Server和Oracle数据库的实时同步

数据同步在大数据应用中扮演着关键角色,它确保了数据的实时性和一致性,为数据分析和决策提供了重要支持。常见的数据同步方式包括ETL实时同步和实时ETL工具,后者可以基于日志追踪或触发器进行分类。不同的数据库系统针对实时同步也有各自的实…

数据采集技术:selenium/正则匹配/xpath/beautifulsoup爬虫实例

专栏介绍 1.专栏面向零基础或基础较差的机器学习入门的读者朋友,旨在利用实际代码案例和通俗化文字说明,使读者朋友快速上手机器学习及其相关知识体系。 2.专栏内容上包括数据采集、数据读写、数据预处理、分类\回归\聚类算法、可视化等技术。 3.需要强…

电影解说 剪辑实战带货全新蓝海市场,电影解说实战课程(16节)

课程目录 1-影视解说自媒体带货新玩法_1.mp4 2-影视解说选品及解说规范标准_1.mp4 3-电影解说的脚本模版及流程_1.mp4 4-电影解说编写文案及爆火规律_1.mp4 5-手把手教你影视素材哪里找_1.mp4 6-影视解说剪辑、配音及创收方式_1.mp4 7-电影解说剪辑的实操课程A_1.mp4 8…

关于Ubuntu系统中.config文件夹如何找到

Ubuntu中QT项目使用了setting保存配置,但是找不到配置文件保存了在哪里,找了一下: 因为QT里取的名字是: 于是下载everything搜索Nio,发现目录为/home/nio/.config 虽然已经下载了everything找到了,但是发现…

fyne常用内置颜色

常用内置颜色 在theme包里有一个关于颜色的color.go 常用颜色如下: theme.PrimaryColor() theme.WarningColor() theme.SuccessColor() theme.ErrorColor() theme.ShadowColor() theme.HyperlinkColor()最终这些会返回color.Color接口。 效果图: theme.HyperlinkColor()和t…

VTK- 面绘制体绘制

在VTK中,面绘制(Surface Rendering)和体绘制(Volume Rendering)是两种常见的三维数据可视化方法。面绘制和体绘制是计算机图形学中用于三维数据可视化的重要技术,尤其在医学成像、科学可视化和计算机辅助设…

Android广播机制

简介 某个网络的IP范围是192.168.0.XXX,子网 掩码是255.255.255.0,那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一 网络上的所有端口,这样在该网络中的每台主机都将会收到这条广播。为了便于进行系统级别的消息通知&…

游戏行业情报 | 手机玩3A终是空想?iOS版3A大作销量滑铁卢

2023年9月的苹果发布会上,苹果宣布iPhone15 Pro系列首发配备的A17 Pro芯片将能够支持3A游戏的游玩,随着该系列设备的发布,《生化危机 4》、《生化危机:村庄》、《死亡搁浅》和《刺客信条:幻景》等大作先后登陆iOS平台。…

Qt 使用 QZipReader 解压文件

Qt 使用 QZipReader 解压文件 文章目录 Qt 使用 QZipReader 解压文件摘要关于 QZipReader使用 QZipReader代码解释: 快速解 extractAll 关键字: Qt、 QZipReader、 extractAll、 Zip、 解压缩 摘要 每日一坑,坑坑难过,今日在…

2024年度 | 推荐PC端时间规划、项目管理软件(最新)

PingCode:适用于IT团队的项目/任务管理。 https://pingcode.com/ Worktile:团队通用的任务规划工具。 https://worktile.com/ Todoist:个人任务管理工具,支持跨平台同步。 Todoist | 管理您工作和生活的To Do List Pomodoro Ti…

Android选择题界面的设计——线性布局实操

目录 任务目标任务分析任务实施 任务目标 使用TextView、Button、CheckBox等实现一个选择题界面,界面如图1所示。 图1 选择题界面效果图 任务分析 上述界面可以分解为上下两部分,上面部分可以使用横向的线性布局来完成,下面部分可以使用…

独家带你get懂印尼直播工具APP借助海外快手kwai短视频广告推广优势

独家带你get懂印尼直播工具APP借助海外快手kwai短视频广告推广优势 随着全球互联网的迅猛发展和移动互联网的普及,广告投放已经成为企业扩大品牌影响力、获取潜在客户的重要手段之一。在印尼这一充满活力的市场中,直播工具APP的广告投放尤为关键。海外快…

快速了解 | 企业代码签名证书怎么弄

企业代码签名证书是用于签名软件、驱动程序、代码库等的数字证书,它能够保证软件的完整性和来源的真实性,从而提升用户对软件的信任度,消除电脑系统对于“未知发布者”软件的安装拦截和弹窗警告,消除微软的SmartScreen提醒。 1、…

ArmPiPro-多人同时开发

V0.0 2024.07.04 ROS节点间的通信是分布式的,也就是节点可以运行在不同的”主机“上,这些主机包括安装在机器人上的主控(Pi4)、通过串口连接PI4的烧写有Serialros的MCU从控、负责视觉开发的VM1、负责移动的VM2、负责机械臂的VM3都…

【自适应滤波系列四】回声消除(Acoustic Echo Cancellation, AEC)信号模型及其本质

什么是回声 关于回声的产生与传播,凌逆战(https://www.cnblogs.com/LXP-Never)大佬在其博客中阐述得很详细,可以去看他的博客,下面部分图片来源于其博客 回声就是声音信号经过一系列反射之后,又听到了自己讲话的声音,这就是回声。一些回声是必要的,比如剧院里的音乐回声…

海豚调度监控:新增依赖缺失巡检,上游改动再也不用担心了!

💡 本系列文章是 DolphinScheduler 由浅入深的教程,涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。 祝开卷有益:) 用过 DolphinScheduler 的小伙伴应该都知道,Dolphin…

代理IP和VPN有什么区别?该怎么选择?

今天我们来聊聊很多人关心的一个问题——代理IP和VPN到底有什么区别?虽然它们听起来差不多,但其实有很大的不同。这篇文章,小编就带大家一起了解一下吧! 什么是代理IP? 代理IP是一种通过代理服务器替换用户真实IP地址…