Android设计模式之Builder模式

news/2025/3/31 4:47:14/

一、定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

二、核心思想:

        分离构造与表示:将对象的构建过程(如参数组合、校验逻辑)与对象本身分离。

        链式调用:通过 return this 实现链式语法,提升代码可读性。

        可选参数处理:避免构造方法重载爆炸,灵活处理可选参数。

三、组成:

        Product:需要构建的复杂对象,比如AlertDialog。

        Builder:定义构建步骤的抽象方法,比如AlertDialog.Builder。

        ConcreteBuilder:实现构建逻辑,最终提供build()方法返回对象。

        Director:可选角色,负责控制构建流程,Android中通常省略这一步。

四、案例:Android源码的AlertDialog.Builder

// 使用 Builder 模式构建 AlertDialog
AlertDialog dialog = new AlertDialog.Builder(context)

    .setIcon(R.drawable.icon)
    .setTitle("提示")
    .setMessage("确定删除吗?")
    .setPositiveButton("确定", (d, which) -> { /* 点击事件 */ })
    .setNegativeButton("取消", null)
    .create();

dialog.show();

源码解析:

1.Builder类将AlertDialog相关参数放到AlertController.AlertParams成员变量P中,Builder类调用create方法创建AlertDialog对象,在create里通过P.apply方法将变量P传入AertDialog的mAlert对象中。

2.调用show方法,显示这个对话框。show方法通过dispatchOnCreate方法调用AlertDialog的onCreate方法,然后调用AlertDialog的onStart方法,最后将Dialog的DecorView添加到WindowManager中。

3.AlertDialog的onCreate方法主要调用了AlertController的installContent方法,installContent方法最终调用Window对象的setContentView方法,类似于Activity一样。

五、优缺点:

        优点:参数灵活,代码可读性高,对象不可变性,构建过程可控。

        缺点:代码冗余,轻微影响性能,但几乎可以忽略不计。

六、适用场景:

        1.参数多且可选,需要构建不同的实例,如网络请求,图片加载,复杂的配置对象。

        2.需要不可变对象,通过Builder一次性构建,后期使用不需要再改变参数。

        3.构建过程复杂,需要根据不同需求或条件去构建不同的对象。

七、与其他模式对比

        工厂模式:关注对象创建的整体性,而Builder模式强调分步构建。

        构造方法:参数过多时,重载方法会异常的多,难以维护,而Builder的链式调用更为清晰易懂。


http://www.ppmy.cn/news/1583708.html

相关文章

(UI自动化测试web端)第三篇:元素的常用操作方法_元素操作

元素操作,大白话来说就是用来模拟人的操作。 点击操作:元素.click() 输入操作:元素.send_keys(“内容”) 清空操作:元素.clear() # 导包selenium from selenium import webdriver import time # 创建浏览器驱动对象 driver…

可视化动态表单动态表单界的天花板--Formily(阿里开源)

文章目录 1、Formily表单介绍2、安装依赖2.1、安装内核库2.2、 安装 UI 桥接库2.3、Formily 支持多种 UI 组件生态: 3、表单设计器3.1、核心理念3.2、安装3.3、示例源码 4、场景案例-登录注册4.1、Markup Schema 案例4.2、JSON Schema 案例4.3、纯 JSX 案例 1、Form…

第五天 开始Unity Shader的学习之旅之Unity中的基础光照之漫反射光照模型

Unity Shader的学习笔记 第五天 开始Unity Shader的学习之旅之Unity中的基础光照之漫反射光照模型 文章目录 Unity Shader的学习笔记前言一、Unity中的环境光和自发光二、漫反射光照模型逐顶点光照① Shader名称② 定义属性③ Tags④ CGPROGRAM和ENDCG⑤ 定义vert和frag⑥ #in…

学习记录(14):iOS部署

时隔多年后,再次部署开发iOS😁😁 1. Unity端设置,在此不再进行赘述(网上一大堆) 2. ⚠️:要保证mac比待部署的设备版本要高 3. Xcode: (1) 打开从 Unity 3D 里打包的文件中,找到有…

【CSS文字渐变动画】

CSS文字渐变动画 HTML代码CSS代码效果图 HTML代码 <div class"title"><h1>今天是春分</h1><p>正是春天到来的日子&#xff0c;花都开了&#xff0c;小鸟也飞回来了&#xff0c;大山也绿了起来&#xff0c;空气也有点嫩嫩的气息了</p>…

VsCode启用右括号自动跳过(自动重写) - 自录制gif演示

VsCode启用右括号自动跳过(自动重写) - 自录制gif演示 前言 不知道大家在编程时候的按键习惯是怎样的。输入完左括号后编辑器一般会自动补全右括号&#xff0c;输入完左括号的内容后&#xff0c;是按→跳过右括号还是按)跳过右括号呢&#xff1f; for (int i 0; i < a.s…

模块23_网络编程正则表达式设计模式

模块23_网络编程&正则表达式&设计模式 文章目录 模块23_网络编程&正则表达式&设计模式第一章.网络编程1.软件结构2.服务器概念3.通信三要素4.UDP协议编程4.1.客户端(发送端)4.2.服务端(接收端) 5.TCP协议编程5.1.编写客户端5.2.编写服务端 6.文件上传6.1.文件上…

网络运维学习笔记(DeepSeek优化版) 024 HCIP-Datacom OSPF域内路由计算

文章目录 OSPF域内路由计算&#xff1a;单区域的路由计算一、OSPF单区域路由计算原理二、1类LSA详解2.1 1类LSA的作用与结构2.2 1类LSA的四种链路类型 三、OSPF路由表生成验证3.1 查看LSDB3.2 查看OSPF路由表3.3 查看全局路由表 四、2类LSA详解4.1 2类LSA的作用与生成条件4.2 2…