在Android中探秘建造者模式

Android之UiAutomator测试框架源码探秘(开篇:架构概览与学习路线图) 本文深入解析Android UiAutomator测试框架的架构设计与源码实现,涵盖核心模块如uiautomator-core、uiautomator-platform等,并提供从API使用到源码分析的学习路线图。通过实战案例展示如何利用UiDevice、UiObject2等关键类进行高效自动化测试,助力开发者掌握这一轻量级测试框架的精髓。 阅读详情

前言

在Android开发过程中,我发现很多安卓源代码里应用了设计模式,比较常用的有适配器模式(各种adapter),建造者模式(Alert Dialog的构建)等等。虽然我们对大多数设计模式都有所了解,但是在应用设计模式的这个方面,感觉很多人在这方面有所不足。所以,我们可以看看Android源代码里面是怎样实现各种设计模式的,从而可以加深我们对设计模式的理解,从而方便我们以后对它的应用。今天,我们就来谈谈设计者模式(Builder Pattern)。

定义

建造者模式(Builder Pattern)也叫做生成器模式,其定义如下:

Separate the construction of a complex object from its representation so that the same construction process can create different representions.
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

它的意思就是将一个对象和怎么构建这个对象分离开来,如果你想构建一个对象,你把这个消息告诉构建者,并且将自己对这个对象的各种要求告诉建造者,然后建造者根据这些要求进行捣鼓,然后,你所需要的一个对象就出来了。

Android源代码AlertDialog的实现

我们先来看下AlertDialog的源代码(只列出关键代码):

public class AlertDialog extends Dialog implements DialogInterface {

    ...

    protected AlertDialog(Context context, int theme) {
    this(context, theme, true);
    }

    AlertDialog(Context context, int theme, boolean createThemeContextWrapper) {
        super(context, resolveDialogTheme(context, theme), createThemeContextWrapper);

        mWindow.alwaysReadCloseOnTouchAttr();
        mAlert = new AlertController(getContext(), this, getWindow());
    }

    protected AlertDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
        super(context, resolveDialogTheme(context, 0));
        mWindow.alwaysReadCloseOnTouchAttr();
        setCancelable(cancelable);
        setOnCancelListener(cancelListener);
        mAlert = new AlertController(context, this, getWindow());
    }

    public static class Builder {
        private final AlertController.AlertParams P;
        private int mTheme;


        public Builder(Context context) {
            this(context, resolveDialogTheme(context, 0));
        }


        public Builder(Context context, int theme) {
            P = new AlertController.AlertParams(new ContextThemeWrapper(
                    context, resolveDialogTheme(context, theme)));
            mTheme = theme;
        }


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

        public AlertDialog create() {
            final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, 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;
        }
        ...
    }
}

从上面我们可以清楚地看到:AlertDialog的Build是一个静态内部类(在有些情况下,我们会单独定义一个Build抽象类,然后用具体类来继承它,实现具体的功能)。我们对AlertDialog设置的属性会暂时保存在Build类的成员变量P(AlertController.AlertParams)中。同时,我们注意到我们设置的属性,它都回返回本身的AlertBuild对象,这样我们就可以不停地调用它设置的方法。

如果我们想获得这个AlertDialog。我们就需要调用建造者的create()方法,在create()方法里面它就会构造出一个Dialog实例,并且将我们刚才设置的属性全部赋给AlertDialog,最后返回AlertDialog的实例。

UniversalImageLoader上面建造者的实现

看完了AlertDialog,我们这边再看一个实例,那就是Android开源框架UniversalImageLoader的DisplayImageOptions类,下面是它的一些核心代码:

public final class DisplayImageOptions {

private final int imageResOnLoading;
private final int imageResForEmptyUri;
private final int imageResOnFail;
private final Drawable imageOnLoading;
private final Drawable imageForEmptyUri;
private final Drawable imageOnFail;
private final boolean resetViewBeforeLoading;
private final boolean cacheInMemory;
private final boolean cacheOnDisk;
private final ImageScaleType imageScaleType;
private final Options decodingOptions;
private final int delayBeforeLoading;
private final boolean considerExifParams;
private final Object extraForDownloader;
private final BitmapProcessor preProcessor;
private final BitmapProcessor postProcessor;
private final BitmapDisplayer displayer;
private final Handler handler;
private final boolean isSyncLoading;

private DisplayImageOptions(Builder builder) {
    imageResOnLoading = builder.imageResOnLoading;
    imageResForEmptyUri = builder.imageResForEmptyUri;
    imageResOnFail = builder.imageResOnFail;
    imageOnLoading = builder.imageOnLoading;
    imageForEmptyUri = builder.imageForEmptyUri;
    imageOnFail = builder.imageOnFail;
    resetViewBeforeLoading = builder.resetViewBeforeLoading;
    cacheInMemory = builder.cacheInMemory;
    cacheOnDisk = builder.cacheOnDisk;
    imageScaleType = builder.imageScaleType;
    decodingOptions = builder.decodingOptions;
    delayBeforeLoading = builder.delayBeforeLoading;
    considerExifParams = builder.considerExifParams;
    extraForDownloader = builder.extraForDownloader;
    preProcessor = builder.preProcessor;
    postProcessor = builder.postProcessor;
    displayer = builder.displayer;
    handler = builder.handler;
    isSyncLoading = builder.isSyncLoading;
}
...
public static class Builder {
    private int imageResOnLoading = 0;
    private int imageResForEmptyUri = 0;
    private int imageResOnFail = 0;
    private Drawable imageOnLoading = null;
    private Drawable imageForEmptyUri = null;
    private Drawable imageOnFail = null;
    private boolean resetViewBeforeLoading = false;
    private boolean cacheInMemory = false;
    private boolean cacheOnDisk = false;
    private ImageScaleType imageScaleType = ImageScaleType.IN_SAMPLE_POWER_OF_2;
    private Options decodingOptions = new Options();
    private int delayBeforeLoading = 0;
    private boolean considerExifParams = false;
    private Object extraForDownloader = null;
    private BitmapProcessor preProcessor = null;
    private BitmapProcessor postProcessor = null;
    private BitmapDisplayer displayer = DefaultConfigurationFactory.createBitmapDisplayer();
    private Handler handler = null;
    private boolean isSyncLoading = false;

public Builder() {
        decodingOptions.inPurgeable = true;
        decodingOptions.inInputShareable = true;
    }

    /**
     * Stub image will be displayed in {@link com.nostra13.universalimageloader.core.imageaware.ImageAware
     * image aware view} during image loading
     *
     * @param imageRes Stub image resource
     * @deprecated Use {@link #showImageOnLoading(int)} instead
     */
    @Deprecated
    public Builder showStubImage(int imageRes) {
        imageResOnLoading = imageRes;
        return this;
    }

    /**
     * Incoming image will be displayed in {@link com.nostra13.universalimageloader.core.imageaware.ImageAware
     * image aware view} during image loading
     *
     * @param imageRes Image resource
     */
    public Builder showImageOnLoading(int imageRes) {
        imageResOnLoading = imageRes;
        return this;
    }
    /** Builds configured {@link DisplayImageOptions} object */
    public DisplayImageOptions build() {
        return new DisplayImageOptions(this);
    }
    ...
    }
}
它比AlertDialog实现更为简单一点,直接将属性定义在Builder的成员变量中,然后将Builder对象返回给DisplayImageOptions中直接进行赋值,这样做的话,将初始化对象的复杂逻辑全部交给了Builder类,而使我们需要的DisplayImageOptions显得非常的干净,功能也相当的简洁明了
Java 设计模式-建造者模式(Builder)Android讲解 Java 设计模式-建造者模式(Builder)结合Android小知识讲解,简单明了 立即下载

相关推荐

Android利用建造者模式自定义Dialog

为了解决Android的碎片化问题,该Android Demo利用建造者模式设计自定义Diolog,即下即用,很方便

建造者模式(Android)

构建者模式(Builder Pattern)是一种创建型设计模式,旨在通过提供一种灵活的方式来构建复杂对象。该模式将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。 具体来说,构建者模式使用一个独立的构建器(Builder)类来封装对象的构建过程。构建器类提供一系列方法来设置对象的属性,并最终返回构建好的对象。这种方式可以避免使用多个构造函数或过多的参数,使得对象的构建过程更加直观和易于扩展。

wei的博客 679

深入理解Android中的建造者模式

前言 在Android开发过程中,我发现很多安卓源代码里应用了设计模式,比较常用的有适配器模式(各种adapter),建造者模式(Alert Dialog的构建)等等。虽然我们对大多数设计模式都有所了解,但是在应用设计模式的这个方面,感觉很多人在这方面有所不足。所以这篇文章我们一起深入的理解Android中的建造者模式。 建造者模式(Builder Pattern)也叫生成器模式,其定义如下: separate the construction of a complex object from its representation so that the same construction p

Android设计模式之建造者模式

建造者模式的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。也就是说将构建过程和部件的表示隔离开,用户可以在不知道内部构建细节的情况下,对对象的构造流程进行相应的控制,比如在Android中典型的Builder模式就是AlerDialog.Builder类。

金戈鐡馬 508

CentOS8静默安装Oracle11.2.0.1

背景 新安装oracle,用静默安装方式就不需要安装图形界面了,省时省力。 前期准备工作与图形化安装一样,如创建用户|用户组、环境变量、内核参数、创建目录等. 可参考图形化安装,链接:https://blog.youkuaiyun.com/heroicpoem/article/details/104229369 环境 平台 版本 操作系统 centOS 8 Oracle 11gR2 1.响应文件 响应文件的内容就是图形化安装时手工设置的选项内容。 解压后,database/response/db

heroicpoem的专栏 4518

SAP ATP检查全解析:从配置到BAPI_RESERVATION_CREATE1应用实例

本文全面解析SAP ATP检查功能,从基础配置到BAPI_RESERVATION_CREATE1高级应用,涵盖物料可用性检查、动态规则设置及性能优化策略。通过实战案例演示如何利用BAPI_MATERIAL_AVAILABILITY实现精准库存承诺,提升供应链效率,特别适合SAP顾问和库存管理人员参考。

dropout6artist的博客 677

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

Builder模式是一种创建型设计模式。将一个复杂对象的创建与它的表示分离,使得同样的构造过程可以创建不同的表示。相同的方法,不同的执行顺序,产生不同的事件结果时;多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;初始化一个对象特别复杂,如参数较多,且很多参数都具有默认值时;UML类图:产品类;抽象Builder类,规范产品的组建,一般由子类实现具体的组建过程;具体的Builder类;统一组装过程;良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节;

故不积跬步无以至千里 1271

疾病负担研究(GBD)——如何使用joinpoint软件计算AAPC

疾病负担研究(GBD)——如何使用joinpoint软件计算AAPC

weixin_44240228的博客 1万+

Android建造者模式(okhttp源码Builder设计模式,AlertDialog源码Builder设计模式)

生活案例:顾名思义,重点就是建造的过程。举例:造车,车是由各种各样的零件组装而成,底盘,轮胎,外壳,座椅等等,生成的流程还是非常固定的,可以把这些组成部分看成一系列的复杂的对象,轮胎可能需要各样的材料组成,外壳或许会有颜色的定制或者材料质量要求,座椅也许也会定制要求真皮材质,非常的多元化。但是它们的组装流程是一样不变的,变化的是它们这些配件的一些内部的细节(颜色,材质等等),但是不影响我们组装汽车的流程。定义:指一个复杂对象的构造和它的表示分离,使得同样的构建流程可以创建不同的表示,被称为建造者模式,它是将

weixin_46039528的博客 848

从零开始:使用Labelme完成图像语义分割标注全流程

本文详细介绍了如何使用Labelme工具完成图像语义分割标注的全流程,从环境安装、数据准备到核心标注操作,并重点讲解了如何将标注结果转换为PASCAL VOC等深度学习框架可用的标准数据集格式。文章还提供了关键的避坑指南和高效技巧,帮助初学者快速上手,高效产出高质量的标注数据。

weixin_29073241的博客 492

C2f-DCN模块详解:可变形卷积与特征融合的完美结合

C2f模块作为YOLOv8的核心创新,代表了目标检测特征提取模块设计的最新进展。通过精简的卷积配置(仅2个基础卷积)、高效的特征重用设计(部分通道分割复用)、以及深层语义与浅层细节的协同建模能力,C2f在结构设计和性能表现上全面超越了前代的C3模块。与C3K2、C3K等变体相比,C2f在遮挡和密集环境下的检测鲁棒性更优,而C3K2和C3K分别在高速检测和多尺度检测方面有专门优化。这种差异化设计反映了YOLO系列模型向场景化、专业化发展的趋势。从设计原理角度看,C2f的核心优势在于其多路径梯度流动优化和。

浩瀚之水的专栏 378

Android设计模式--Builder建造者模式

优点:1,封装性好,使用Builder模式可以使客户端不必知道产品内部组成的细节2,建造者独立,容易扩展缺点:会产生多余的Builder对象,消耗内存。

袁震的博客 1128

【DRAM存储器四十三】LPDDR5介绍--寻址

简要说明LPDDR5 X16、x8 die的寻址

highman110的博客 967

CookieBar2源码探秘:轻量级通知库的设计原理与实现细节

CookieBar2是一款专为Android平台打造的轻量级通知库,它能够在屏幕顶部或底部展示文本消息、通知和提醒,是Toast和Snackbar的理想替代方案。通过灵活的配置选项和优雅的动画效果,CookieBar2为开发者提供了一种简单而强大的方式来增强应用的用户体验。 ## 核心功能与设计理念 CookieBar2的设计核心理念是**简洁、灵活和可定制**。作为一款轻量级库,它专注于解决

gitblog_01096的博客 757

8.19华为OD机试真题 新系统 - 基站低能耗时段统计 (Java/Py/C/C++/Js/Go)

8.19华为OD机试真题 新系统 - 基站低能耗时段统计 (Java/Py/C/C++/Js/Go)

算法大师! 1146

手把手教你学AUTOSAR(13.1)--基于 AUTOSAR 的开发实战实例(一)

通过上述几个基于 AUTOSAR 的开发实战实例,你可以全面了解如何从需求分析、系统设计、软件开发、集成测试到部署和验证等多个环节进行 AUTOSAR 系统的开发。这些实例不仅涵盖了不同的应用场景,还提供了具体的代码实现和技术细节,帮助你更好地应用 AUTOSAR 标准。

MHD0815的博客 1195

Android串口通信探秘:解码硬件对话的艺术

你是否曾经好奇,Android设备如何与外部硬件进行秘密对话?今天,我们将一起揭开这个技术谜团,探索串口通信的神秘世界。 ## 🕵️‍♂️ 硬件对话的密码本 在Android与硬件设备建立连接之前,你需要掌握一套特殊的"通信密码"。这套密码由五个关键参数组成: - **波特率**:对话的速度节奏,就像两个人交流时的语速 - **数据位**:每次传输的信息量,可以是5到8个比特 - **校验

gitblog_00562的博客 283

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

最新android设计模式—建造者(Builder)设计模式(1),2024年最新2024年字节跳动、阿里等大厂Android面试题

由于文章篇幅原因,我只把面试题列了出来,详细的答案,我整理成了一份PDF文档,这份文档还包括了还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 ,帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!

2401_84558442的博客 856

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android设计模式——建造者模式

设计是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性好。我们使用设计模式最终的目的是实现代码的高内聚和低耦合。## 建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;用户只需指定需要建造的类型就可以得到它们,而不需要建造过程及细节。

qq_32403767的博客 210

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android中建造者(builder)模式

常用设计模式 建造者、builder模式 举例 例子 实战应用 分析 讲解 应用 源码分析 举例 23种实际模式之一

u014769864的博客 1898

Android设计模式之建造者模式(Builder Pattern)

假如一个对象由许多不同的属性构造,我们想要构造一个我们自己指定特定属性的对象,最简单的方法就是为每种情况提供一个构造函数,我们根据不要的构造函数来得到我们需要的包含了指定属性的对象。我们还是举个例子吧。一个人有姓名、性别、年龄、身高,体重这五个属性组成,当我们创建一个人这个对象的时候,我们可能有下面这些情况:1、只希望指定姓名 2、只希望指定性别 3、只希望指定年龄 4、只希望指定身高 5、

欢迎关注微信公众号:DroidMind 7825

Android设计模式学习之Builder模式

可以看到,通过Builder来设置AlertDialog中的title, message, button等参数, 这些参数都存储在类型为AlertController.AlertParams的成员变量P中,AlertController.AlertParams中包含了与之对应的成员变量。1.相同的方法,不同的执行顺序,产生不同的事件结果时;在Android源码中,我们最常用到的Builder模式就是AlertDialog.Builder, 使用该Builder来构建复杂的AlertDialog对象。

老皮的博客 830

Android设计模式之建造者模式与典型应用

摘要:Android开发中,建造者模式通过分离复杂对象的构建与表示,优化多参数对象的创建过程。核心角色包括产品、抽象建造者、具体建造者和指挥者。实现方式分为传统建造者模式(如User.Builder)和简化版(Kotlin默认参数),典型应用包括AlertDialog.Builder等。该模式提升代码可读性、支持参数校验,但会增加代码量。适用于参数复杂的场景,简单对象可能适得其反。注意事项包括Builder类的位置选择和build()时的参数校验。

分享技术和日常 1138
上一篇: android 常用方法集合
下一篇: 源码分析:LayoutParams的wrap_content, match_parent, 和具体值
xiaoxiandroid
博客等级 码龄12年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值