当前位置: 首页 > news >正文

安卓常见设计模式2------构建者模式(Kotlin版)

1. W1 是什么,什么是构建者模式?

  1. 构建者模式(Builder Pattern)是一种创建复杂对象的设计模式。它通过使用链式调用的方式,逐步构建对象,使得代码更易读、可维护,并且可以处理许多可选参数的情况。

2. W2 为什么,为什么需要使用构建者模式,使用构建者模式能给我们编码带来什么好处?

在某些情况下,约定优于配置。也就是说我们开发者更加青睐“开箱即用”,有些参数我们可以不用关注就能使用,但是又能够自定义配置。换句话说,可以不用,但是不能没有。

  1. 简化对象的创建:构建者模式通过提供一种逐步构建对象的方式,使得创建复杂对象变得简单和直观。它将对象的构建过程分解为一系列步骤,并使用链式调用的方式设置对象的属性。这样,开发者可以一步一步地指定对象的各个属性,而无需一次性提供所有参数。

  2. 提高可读性和可维护性:通过使用构建者模式,代码的可读性和可维护性得到提高。构建者模式允许开发者在代码中清晰地看到对象的构建过程,从而更容易理解和修改代码。此外,由于使用了链式调用,代码的组织结构更加清晰,易于阅读和编写。

  3. 处理可选参数:在安卓开发中,某些对象可能具有许多可选参数,而不是所有参数都需要在每次创建对象时提供。使用构建者模式,可以通过提供一些设置方法来设置可选参数,而不是在构造函数中使用大量的参数。这使得代码更加简洁,避免了长参数列表的问题。

  4. 增强对象的不可变性:构建者模式通常与不可变对象(Immutable Objects)一起使用。不可变对象是指其状态在创建后不能更改的对象。通过使用构建者模式,可以在对象创建过程中设置所有必要的属性,并在对象构建完成后将其设置为不可变,从而确保对象的一致性和线程安全性。

  5. 支持多种构建选项:构建者模式可以支持多个不同的构建选项,通过提供不同的构建者实现。每个构建者可以根据特定的需求和场景进行配置,从而创建不同的对象。这样,开发者可以根据需要选择合适的构建者,以满足特定的构建需求。

3. W3,如何使用?

下面是代码示例:

// 首先,我们定义一个要构建的对象的类,例如一个简单的用户类(User)
class User private constructor(val name: String,val age: Int,val email: String,val address: String?
) {// User 类的其他方法和逻辑class Builder(private val name: String, private val age: Int, private val email: String) {private var address: String? = nullfun setAddress(address: String): Builder {this.address = addressreturn this}fun build(): User {return User(name, age, email, address)}}
}// 现在,我们可以使用构建者来创建 User 对象:
val user = User.Builder("John", 25, "john@example.com").setAddress("123 Main St").build()

Thank you for your reading, have a nice day!

相关文章:

安卓常见设计模式2------构建者模式(Kotlin版)

1. W1 是什么,什么是构建者模式? 构建者模式(Builder Pattern)是一种创建复杂对象的设计模式。它通过使用链式调用的方式,逐步构建对象,使得代码更易读、可维护,并且可以处理许多可选参数的情况…...

redis主从复制+哨兵

1.主从复制 redis配置文件redis.conf master机器:IP 192.168.1.5 ,端口 6379 设置配置参数 daemonize yes #bind 127.0.0.1 -::1 protected-mode no port 6379 dbfilename "dump.rdb" dir "/root/redis/my_redis_conf/dumpdir" l…...

html动态爱心超文本标记代码,丝滑流畅有特效,附源码

没想到现在看个剧&#xff08;点燃我&#xff0c;温暖你&#xff09;要的同款居然是代码&#xff0c;李峋 这盛世如你所愿啊&#xff01;李峋的同款爱心代码来啦&#xff0c;拿走试试吧&#xff5e; <!DOCTYPE html> <html><head><title></title&g…...

力扣:162. 寻找峰值(Python3)

题目&#xff1a; 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ 。 你必须实现时…...

【Python】20大报告生成词云

这个我其实写过一篇类似的博客&#xff0c;但是那个的文件对象是.csv&#xff0c;对应到.docx文件的话&#xff0c;就不太适用了。如下&#xff1a; Python生成词云-CSDN博客 代码&#xff1a; import jieba import os import wordcloud import numpy as np from PIL import…...

目标检测YOLO实战应用案例100讲-基于无人机的轻量化目标检测系统设计

目录 前言 国内外研究现状 国外研究现状 国内研究现状...

ansible-第二天

ansible 第二天 以上学习了ping、command、shell、script模块&#xff0c;但一般不建议使用以上三个&#xff0c;因为这三个模块没有幂等性。举例如下&#xff1a; [rootcontrol ansible]# ansible test -a "mkdir /tmp/1234"[WARNING]: Consider using the file …...

【测试工具】UnixBench 测试

一、UnixBench 简介 UnixBench 原本叫做 BYTE UNIX benchmark suite。软件为 Unix 类的系统提供了一些基本的性能指标。通过不同的测试来测试系统不同方面的性能&#xff08;2D&#xff0c;3D&#xff0c;CPU&#xff0c;内存等等&#xff09;。这些测试的结果将和一些标准的系…...

软件测试金融项目,在测试的时候一定要避开的一些雷区

软件测试金融项目需要格外谨慎和专注&#xff0c;因为这些项目通常涉及大量的交易、用户隐私和其他敏感信息。以下是一些软件测试金融项目时需要关注的方面&#xff1a; 1. 数据保护 在测试金融项目时&#xff0c;必须确保用户数据和投资信息得到保护。测试人员必须确保测试环…...

顺序图——画法详解

百度百科的定义&#xff1a; 顺序图是将交互关系表示为一个二维图。纵向是时间轴&#xff0c;时间沿竖线向下延伸。横向轴代表了在协作中各独立对象的类元角色。类元角色用生命线表示。当对象存在时&#xff0c;角色用一条虚线表示&#xff0c;当对象的过程处于激活状态时&…...

easyexcel==省市区三级联动

省市区三级联动&#xff0c;不选前面的就没法选后面的 package com.example.demoeasyexcel.jilian2; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; import org.apache.poi.ss.use…...

Linux进程控制(二)--进程等待(一)

前言&#xff1a;之前我们讲过&#xff0c;子进程退出&#xff0c;父进程如果不管不顾&#xff0c;就可能造成‘僵尸进程’的问题&#xff0c;进而造成内存泄漏。 另外&#xff0c;进程一旦变成僵尸状态&#xff0c;那就刀枪不入&#xff0c;就连 kill -9 也无能为力&#xff0…...

【C++】C++11常用特性梳理

C11特性梳理 1. 列表初始化2. auto & decltype3. 右值引用3.1. 左右值引用比较3.2. 右值引用的意义3.3. 万能引用与完美转发3.4. 移动构造与移动赋值 4. default & delete5. 可变参数模板6. push_back 与 emplace_back7. lambda表达式7.1. 捕捉列表 8. function包装器8…...

修改iframe生成的pdf的比例

如图想要设置这里的默认比例 在iframe连接后面加上#zoom50即可&#xff0c;50是可以随便设置的&#xff0c;设置多少就是多少比例 <iframe src"name.pdf#zoom50" height"100%" width"100%"></iframe>...

C++之list的用法介绍

C之list的用法介绍 1&#xff09;定义和初始化&#xff1a; #include <list> std::list<int> my_list; // 定义一个整数类型的list std::list<std::string> my_other_list {"apple", "banana", "cherry"}; // 初始化一个…...

Mybatis-plus 内部提供的 ServiceImpl<M extends BaseMapper<T>, T> 学习总结

作用 当集成Mybatis-Plus 后&#xff0c;我们的大部分数据库操作都可以通过 XxxxxMapper &#xff0c;同时 Mybatis-plus 在Mapper 提供基本操作方法的同时&#xff0c;也提供类基础的 serviceImpl 来帮助我们完成一些常见的基本操作。 使用 一般情况下&#xff0c;我们首先…...

yolov5 利用Labelimg对图片进行标注

首先打开yolov5-master&#xff0c;在data文件中新建一个文件夹来存放你需要跑的数据&#xff0c;例如我这次跑的是羽毛球&#xff0c;文件把文件取名为badminton。使用其他文件夹例如images也可以&#xff0c;就是跑多了以后不好整理&#xff0c;然后点击 选中刚刚你存放数据的…...

完整版付费进群带定位源码

看到别人发那些不是挂羊头卖狗肉&#xff0c;要么就是发的缺少文件引流的。恶心的一P 这源码是我付费花钱买的分享给大家&#xff0c;功能完整。 搭建教程 nginx1.2 php5.6--7.2均可 最好是7.2 第一步上传文件程序到网站根目录解压 第二步导入数据库&#xff08;shujuk…...

华为L410上制作内网镜像模板01

原文链接&#xff1a;华为L410上制作离线安装软件模板01 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇在内网搭建Apache服务器&#xff0c;用于安装完内网操作系统后&#xff0c;在第一次开机时候&#xff0c;为系统安装软件&#xff0c;今天给大家用WeChat举例&a…...

linuxC语言缓冲区及小程序的实现

文章目录 1.文件缓冲区1.1介绍1.2缓冲文件系统1.3冲刷函数fflush1.4认识linux下的缓冲区 2.linux小程序的实现2.1 回车\r和换行\n2.2倒计时程序2.3进度条小程序sleep/usleep代码运行结果 1.文件缓冲区 1.1介绍 为缓和 CPU 与 I/O 设备之间速度不匹配&#xff0c;文件缓冲区用以…...

Go语言怎么用信号量控制并发_Go语言semaphore信号量教程【入门】

Go 官方标准库不提供 semaphore 类型&#xff0c;应使用 golang.org/x/sync/semaphore&#xff1b;Acquire 阻塞等待许可&#xff0c;TryAcquire 立即返回&#xff1b;必须严格配对申请与释放&#xff0c;且由同一 goroutine 执行&#xff1b;适用于 I/O 密集型资源限流&#x…...

SerialPlot终极指南:3分钟快速上手串口数据可视化工具

SerialPlot终极指南&#xff1a;3分钟快速上手串口数据可视化工具 【免费下载链接】serialplot Small and simple software for plotting data from serial port in realtime. 项目地址: https://gitcode.com/gh_mirrors/se/serialplot 你是否曾面对串口输出的海量数字数…...

FanControl终极指南:5分钟搞定Windows风扇智能控制,告别噪音烦恼[特殊字符]

FanControl终极指南&#xff1a;5分钟搞定Windows风扇智能控制&#xff0c;告别噪音烦恼&#x1f525; 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: http…...

从理论到仿真:用ADS复现Doherty功放的高效奥秘

1. Doherty功放为何能成为5G时代的效率担当&#xff1f; 第一次接触Doherty功放时&#xff0c;我和大多数射频工程师一样充满疑惑&#xff1a;为什么这个诞生于1936年的老技术&#xff0c;反而在5G时代大放异彩&#xff1f;直到我用ADS软件完整复现了它的工作过程&#xff0c;才…...

数字信号处理——上采样(Upsampling)和下采样(Downsampling)

目录 1. 上采样(upsampling) 2. 下采样(downsampling) 1. 上采样(upsampling) 上采样的过程(亦称为“升采样(upscaling)”或“扩展(expansion)”)是在不改变原信号基本内容的前提下&#xff0c;为其添加更多数据点,即增加数据的空间分布率和采样频率。当这一过程应用于信…...

(一)openEuler的安装和使用基础

一、官网下载openEuler镜像 1.进入官网&#xff0c;点击如图 2.点击所有版本 3.这里学习使用openEuler 22.03 LTS SP2&#xff0c;前往下载 4.选择自己主机用的架构&#xff0c;我这里是x86_64&#xff0c;下载标准版 二、搭建openEuler虚拟机 1.创建新的虚拟机 2.选择自定义…...

OpenCV保存视频总出问题?可能是FourCC编码器没选对!手把手教你选XVID、MJPG还是MP4V

OpenCV视频保存难题破解&#xff1a;FourCC编码器选择实战指南 引言 视频处理是计算机视觉项目中的常见需求&#xff0c;而OpenCV作为最流行的视觉库&#xff0c;其cv2.VideoWriter功能却经常让开发者陷入困境——保存的视频无法播放、文件体积爆炸式增长、画质惨不忍睹。这些…...

【学员故事】源源:从无人听到争相咨询,学习毛丫讲绘本,托育园招生很顺利

我来自江苏无锡&#xff0c;是一名托育机构的创办者和老师。在早期办学过程中&#xff0c;我和许多从业者一样&#xff0c;面临着如何提升课程吸引力、获得家长认可的难题。曾经我也认为家长只关心孩子的照护问题&#xff0c;课程内容并不重要。直到我开始专注于绘本教学&#…...

Unity学习90天-第7天-学习委托与事件(简化版)

欢迎回来&#xff01; 今天我们来搞定理解委托和事件的核心概念&#xff0c;用"受伤、得分、游戏结束"三个游戏场景掌握解耦思路&#xff01;一、为什么要用事件&#xff1f;先看"耦合"的痛点假设玩家受伤时&#xff0c;需要同时做三件事&#xff1a;、玩家…...

别再手动写JCo3.0连接代码了!用Spring Boot整合SAP RFC接口的完整配置流程

Spring Boot与SAP JCo3.0深度整合&#xff1a;告别繁琐的手工RFC调用 在传统企业IT架构中&#xff0c;SAP系统往往扮演着核心业务中枢的角色。当Java开发者需要与SAP进行数据交互时&#xff0c;JCo3.0&#xff08;Java Connector&#xff09;几乎是绕不开的技术选择。但原生JCo…...