安卓常见设计模式2------构建者模式(Kotlin版)
1. W1 是什么,什么是构建者模式?
- 构建者模式(Builder Pattern)是一种创建复杂对象的设计模式。它通过使用链式调用的方式,逐步构建对象,使得代码更易读、可维护,并且可以处理许多可选参数的情况。
2. W2 为什么,为什么需要使用构建者模式,使用构建者模式能给我们编码带来什么好处?
在某些情况下,约定优于配置。也就是说我们开发者更加青睐“开箱即用”,有些参数我们可以不用关注就能使用,但是又能够自定义配置。换句话说,可以不用,但是不能没有。
-
简化对象的创建:构建者模式通过提供一种逐步构建对象的方式,使得创建复杂对象变得简单和直观。它将对象的构建过程分解为一系列步骤,并使用链式调用的方式设置对象的属性。这样,开发者可以一步一步地指定对象的各个属性,而无需一次性提供所有参数。
-
提高可读性和可维护性:通过使用构建者模式,代码的可读性和可维护性得到提高。构建者模式允许开发者在代码中清晰地看到对象的构建过程,从而更容易理解和修改代码。此外,由于使用了链式调用,代码的组织结构更加清晰,易于阅读和编写。
-
处理可选参数:在安卓开发中,某些对象可能具有许多可选参数,而不是所有参数都需要在每次创建对象时提供。使用构建者模式,可以通过提供一些设置方法来设置可选参数,而不是在构造函数中使用大量的参数。这使得代码更加简洁,避免了长参数列表的问题。
-
增强对象的不可变性:构建者模式通常与不可变对象(Immutable Objects)一起使用。不可变对象是指其状态在创建后不能更改的对象。通过使用构建者模式,可以在对象创建过程中设置所有必要的属性,并在对象构建完成后将其设置为不可变,从而确保对象的一致性和线程安全性。
-
支持多种构建选项:构建者模式可以支持多个不同的构建选项,通过提供不同的构建者实现。每个构建者可以根据特定的需求和场景进行配置,从而创建不同的对象。这样,开发者可以根据需要选择合适的构建者,以满足特定的构建需求。
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动态爱心超文本标记代码,丝滑流畅有特效,附源码
没想到现在看个剧(点燃我,温暖你)要的同款居然是代码,李峋 这盛世如你所愿啊!李峋的同款爱心代码来啦,拿走试试吧~ <!DOCTYPE html> <html><head><title></title&g…...
力扣:162. 寻找峰值(Python3)
题目: 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ 。 你必须实现时…...
【Python】20大报告生成词云
这个我其实写过一篇类似的博客,但是那个的文件对象是.csv,对应到.docx文件的话,就不太适用了。如下: Python生成词云-CSDN博客 代码: import jieba import os import wordcloud import numpy as np from PIL import…...
目标检测YOLO实战应用案例100讲-基于无人机的轻量化目标检测系统设计
目录 前言 国内外研究现状 国外研究现状 国内研究现状...
ansible-第二天
ansible 第二天 以上学习了ping、command、shell、script模块,但一般不建议使用以上三个,因为这三个模块没有幂等性。举例如下: [rootcontrol ansible]# ansible test -a "mkdir /tmp/1234"[WARNING]: Consider using the file …...
【测试工具】UnixBench 测试
一、UnixBench 简介 UnixBench 原本叫做 BYTE UNIX benchmark suite。软件为 Unix 类的系统提供了一些基本的性能指标。通过不同的测试来测试系统不同方面的性能(2D,3D,CPU,内存等等)。这些测试的结果将和一些标准的系…...
软件测试金融项目,在测试的时候一定要避开的一些雷区
软件测试金融项目需要格外谨慎和专注,因为这些项目通常涉及大量的交易、用户隐私和其他敏感信息。以下是一些软件测试金融项目时需要关注的方面: 1. 数据保护 在测试金融项目时,必须确保用户数据和投资信息得到保护。测试人员必须确保测试环…...
顺序图——画法详解
百度百科的定义: 顺序图是将交互关系表示为一个二维图。纵向是时间轴,时间沿竖线向下延伸。横向轴代表了在协作中各独立对象的类元角色。类元角色用生命线表示。当对象存在时,角色用一条虚线表示,当对象的过程处于激活状态时&…...
easyexcel==省市区三级联动
省市区三级联动,不选前面的就没法选后面的 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进程控制(二)--进程等待(一)
前言:之前我们讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。 另外,进程一旦变成僵尸状态,那就刀枪不入,就连 kill -9 也无能为力࿰…...
【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即可,50是可以随便设置的,设置多少就是多少比例 <iframe src"name.pdf#zoom50" height"100%" width"100%"></iframe>...
C++之list的用法介绍
C之list的用法介绍 1)定义和初始化: #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 后,我们的大部分数据库操作都可以通过 XxxxxMapper ,同时 Mybatis-plus 在Mapper 提供基本操作方法的同时,也提供类基础的 serviceImpl 来帮助我们完成一些常见的基本操作。 使用 一般情况下,我们首先…...
yolov5 利用Labelimg对图片进行标注
首先打开yolov5-master,在data文件中新建一个文件夹来存放你需要跑的数据,例如我这次跑的是羽毛球,文件把文件取名为badminton。使用其他文件夹例如images也可以,就是跑多了以后不好整理,然后点击 选中刚刚你存放数据的…...
完整版付费进群带定位源码
看到别人发那些不是挂羊头卖狗肉,要么就是发的缺少文件引流的。恶心的一P 这源码是我付费花钱买的分享给大家,功能完整。 搭建教程 nginx1.2 php5.6--7.2均可 最好是7.2 第一步上传文件程序到网站根目录解压 第二步导入数据库(shujuk…...
华为L410上制作内网镜像模板01
原文链接:华为L410上制作离线安装软件模板01 hello,大家好啊,今天给大家带来一篇在内网搭建Apache服务器,用于安装完内网操作系统后,在第一次开机时候,为系统安装软件,今天给大家用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 设备之间速度不匹配,文件缓冲区用以…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
