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

android设计模式的建造者模式,请举例

在Android开发中,建造者模式(Builder Pattern)是一种常用的设计模式,它主要用于构建复杂对象。建造者模式通过将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这种模式特别适用于那些需要多个步骤来创建对象的场景,并且这些步骤的顺序可能是固定的,但具体的值可能是变化的。

建造者模式的基本结构

  1. 产品(Product)角色:它是被构建的复杂对象,包含多个组成部件的类(属性)。
  2. 抽象建造者(Builder)角色:定义一个接口,用于规范产品对象的各个组成成分的建造。一般为抽象类或接口,包含创建产品各个子部件的抽象方法。
  3. 具体建造者(ConcreteBuilder)角色:实现Builder接口,完成复杂产品的各个部件的具体创建方法。在构造方法内部,通常还包含一个指向产品对象的引用,这个引用是在具体的builder初始化时传入的。
  4. 指挥者(Director)角色:负责安排已有模块的顺序,然后告诉Builder开始建造。

Android中的建造者模式示例

假设我们需要在Android中创建一个复杂的用户信息对象UserInfo,这个对象包含姓名、年龄、地址等多个属性,并且这些属性的设置可能依赖于不同的场景。

1. 定义产品(Product)
 

java复制代码

public class UserInfo {
private String name;
private int age;
private String address;
// 私有构造函数,防止外部直接创建
private UserInfo() {}
// Getter 和 Setter 省略
@Override
public String toString() {
return "UserInfo{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
2. 定义抽象建造者(Builder)
 

java复制代码

public interface UserInfoBuilder {
UserInfoBuilder setName(String name);
UserInfoBuilder setAge(int age);
UserInfoBuilder setAddress(String address);
UserInfo build();
}
3. 定义具体建造者(ConcreteBuilder)
 

java复制代码

public class UserInfoBuilderImpl implements UserInfoBuilder {
private UserInfo userInfo;
public UserInfoBuilderImpl() {
this.userInfo = new UserInfo();
}
@Override
public UserInfoBuilder setName(String name) {
userInfo.setName(name);
return this; // 链式调用
}
@Override
public UserInfoBuilder setAge(int age) {
userInfo.setAge(age);
return this;
}
@Override
public UserInfoBuilder setAddress(String address) {
userInfo.setAddress(address);
return this;
}
@Override
public UserInfo build() {
return userInfo;
}
}
4. 使用(指挥者角色可以省略,因为直接通过建造者即可构建对象)
 

java复制代码

public class BuilderPatternDemo {
public static void main(String[] args) {
UserInfoBuilder userInfoBuilder = new UserInfoBuilderImpl();
UserInfo userInfo = userInfoBuilder
.setName("张三")
.setAge(30)
.setAddress("北京市朝阳区")
.build();
System.out.println(userInfo);
}
}

在这个例子中,我们没有显式地定义指挥者(Director)角色,因为直接通过建造者(UserInfoBuilderImpl)就可以完成对象的构建。这种方式在Android开发中非常常见,尤其是在处理那些需要多个步骤来初始化的复杂对象时。

相关文章:

  • Tesla T4 P2P测试
  • Apache Iceberg 与 Spark整合-使用教程(Iceberg 官方文档解析)
  • 重头开始嵌入式第四十二天(硬件 ARM体系架构)
  • 计算机网络(八) —— Udp协议
  • powershell@update-help更新文档和离线文档安装@并行加速安装帮助文档更新@安装报错问题
  • 【LeetCode:219. 存在重复元素 II + 哈希表】
  • Ant design vue中的提示框(a-tooltip)
  • Linux应用开发实验班——JSON-RPC
  • 大数据新视界 --大数据大厂之HBase 在大数据存储中的应用与表结构设计
  • 【有啥问啥】“弱激励学习(Weak Incentive Learning)”的原理与过程解析
  • 如何使用ssm实现基于SpringMVC网上选课系统的设计与实现
  • 努比亚z17努比亚NX563j原厂固件卡刷包下载_刷机ROM固件包下载-原厂ROM固件-安卓刷机固件网
  • Python图形用户界面设计的15个基础组件
  • 代码编码规范文档(参考)
  • GPT实现联网,NextChat插件的配置说明
  • Angularjs之国际化
  • CentOS7简单部署NFS
  • javascript 总结(常用工具类的封装)
  • js对象的深浅拷贝
  • Median of Two Sorted Arrays
  • rabbitmq延迟消息示例
  • React系列之 Redux 架构模式
  • SQLServer插入数据
  • TypeScript实现数据结构(一)栈,队列,链表
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 选择阿里云数据库HBase版十大理由
  • # 达梦数据库知识点
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $(function(){})与(function($){....})(jQuery)的区别
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (八)Flask之app.route装饰器函数的参数
  • (差分)胡桃爱原石
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (学习总结)STM32CubeMX HAL库 学习笔记撰写心得
  • (原創) 未来三学期想要修的课 (日記)
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core 成都线下面基会拉开序幕
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .net 发送邮件
  • @Bean有哪些属性
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @ModelAttribute注解使用
  • @RequestMapping 的作用是什么?
  • @RestControllerAdvice异常统一处理类失效原因
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)