设计模式相关面试问题-Builder基础详解与代码解读
java的builder模式详解:
- 概念:
建造者模式是较为复杂的创建型模式,它将客户端与多含多个组成部分(或部件)的复杂对象的创建过程分离。 - 使用场景:
当构造一个对象需要很多参数的时候,并且参数的个数或者类型不固定的时候。 - UML结构图分析:

下面具体介绍一下角色:
Builder:它为创建一个产品Product对象的各个部件指定抽象接口。
ConcreteBuilder:它实现了Builder接口,实现各个部件的具体构造和装配方法。
Product:它是被构建的复杂对象,包含多个组成部件。
Director:指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系。 - 实际代码分析:
先新建Product类:public class Product {
/* 定义部件,部件可以是任意类型,包括值类型和引用类型 */
private String partA;
private String partB;
private String partC; public String getPartA() {
return partA;
} public void setPartA(String partA) {
this.partA = partA;
} public String getPartB() {
return partB;
} public void setPartB(String partB) {
this.partB = partB;
} public String getPartC() {
return partC;
} public void setPartC(String partC) {
this.partC = partC;
} @Override
public String toString() {
return "Product{" +
"partA='" + partA + '\'' +
", partB='" + partB + '\'' +
", partC='" + partC + '\'' +
'}';
}
}然后再定义抽像的Builder类:
abstract class Builder {
//创建产品对象
protected Product product = new Product(); public Product getResult() {
return product;
} protected abstract void buildPartA(); protected abstract void buildPartB(); protected abstract void buildPartC();
}再定义具体的Builder类:
/**
* 具体构建者
*/
public class ConcreteBuilder extends Builder {
@Override
protected void buildPartA() {
product.setPartA("aaaa");
} @Override
protected void buildPartB() {
product.setPartB("bbbb");
} @Override
protected void buildPartC() {
product.setPartC("cccc");
}
}最后新建Director供客户端调用的指挥类:
/**
* 建造指挥者
*/
public class Director { private Builder builder; public void setBuilder(Builder builder) {
this.builder = builder;
} public Director(Builder builder) {
this.builder = builder;
} //产品构建与组装方法
public Product construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}然后客户端去使用一下:

而如果修改构造细节:

其结果也会变化:

这里需要注意:在实际使用建造者模式时,可能只会用到ConcreteBuilder对像来构建,而不会完全按照UML类的结构来。 - Builder模式优点:
1、松散耦合:生成器模式可以用同一个构建算法构建出表现上完全不同的产品,实现产品构建与产品表现上的分离。
2、可以很容易的改变产品的内部表示。
3、更好的复用性:生成器模式很好的实现构建算法和具体产品实现的分离。 - Builder模式缺点:
会产生多余的Builder对象以及Director对象,消耗内存。
builder模式在android中的实际运用:
AlertDialog就是典型应用Builder模式的最好代表,下面来从代码角度来分析一下:

其中AlertController肯定是控制相关业务的,先来看一下它是在哪初始化的,很显然从构造方法中去找寻:

发现在是最后一个构造方法中去初始化的,具体如下:

接着来看一下AlertDialog.onCreate()方法:

此时看一下具体实现:

先不看具体细节,从这个调用层次来看真正实现业务逻辑的就是AlerController,接下来回到AlerDialog的Builder内部类:

然后在这个Builder类中有个onCreate()方法,如下:

接下来看一下这个apply的执行细节:

最后再来看一下AlertController.installContent()的细节:
调用的是父类的方法:

接着再来看一下这个方法:


设计模式相关面试问题-Builder基础详解与代码解读的更多相关文章
- 深入浅出DOM基础——《DOM探索之基础详解篇》学习笔记
来源于:https://github.com/jawil/blog/issues/9 之前通过深入学习DOM的相关知识,看了慕课网DOM探索之基础详解篇这个视频(在最近看第三遍的时候,准备记录一点东西 ...
- Dom探索之基础详解
认识DOM DOM级别 注::DOM 0级标准实际并不存在,只是历史坐标系的一个参照点而已,具体的说,它指IE4.0和Netscape Navigator4.0最初支持的DHTML. 节点类型 注:1 ...
- Android中Canvas绘图基础详解(附源码下载) (转)
Android中Canvas绘图基础详解(附源码下载) 原文链接 http://blog.csdn.net/iispring/article/details/49770651 AndroidCa ...
- javaScript基础详解(1)
javaScript基础详解 首先讲javaScript的摆放位置:<script> 与 </script> 可以放在head和body之间,也可以body中或者head中 J ...
- Python学习一:序列基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:moyi@moyib ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- 三剑客基础详解(grep、sed、awk)
目录 三剑客基础详解 三剑客之grep详解 1.通配符 2.基础正则 3.grep 讲解 4.拓展正则 5.POSIX字符类 三剑客之sed讲解 1.sed的执行流程 2.语法格式 三剑客之Awk 1 ...
- java继承基础详解
java继承基础详解 继承是一种由已存在的类型创建一个或多个子类的机制,即在现有类的基础上构建子类. 在java中使用关键字extends表示继承关系. 基本语法结构: 访问控制符 class 子类名 ...
- java封装基础详解
java封装基础详解 java的封装性即是信息隐藏,把对象的属性和行为结合成一个相同的独立单体,并尽可能地隐藏对象的内部细节. 封装的特性是对属性来讲的. 封装的目标就是要实现软件部件的"高 ...
随机推荐
- Exchange Server 2010安装
Exchange Server 2010安装 Exchange Server 2010是Microsoft最新的邮件服务器软件,功能比较强大.在此,我们在虚拟机中安装体验一下,主要步骤如下: (1) ...
- RFID/13.56MHZ/NFC线圈防干扰原理-附磁导材料防干扰原理 20191128
RFID/13.56MHZ/NFC之间采用电磁感应方式进行通信. 1.铁氧体.硅钢片等导磁材料的相对磁导率比较高,多年前在变压器中已经有广泛的应用.有防止磁通饱和,提高变压器感应效率的作用. 2.RF ...
- [Comet OJ - Contest #6 D][48D 2280]另一道树题_并查集
另一道树题 题目大意: 数据范围: 题解: 这个题第一眼能发现的是,我们的答案分成两种情况. 第一种是在非根节点汇合,第二种是在根节点汇合. 尝试枚举在第几回合结束,假设在第$i$回合结束的方案数为$ ...
- Minimum Number of Arrows to Burst Balloons
There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...
- [转帖]k8s.gcr.io/pause的作用
k8s.gcr.io/pause的作用 https://blog.51cto.com/liuzhengwei521/2422120 weilovepan520关注0人评论196人阅读2019-07-2 ...
- 数据去重 -uniq
也是经常和管道 一起操作的. -c 每行出现的次数 -d 仅仅显示重复行 -u 仅仅显示不重复行 -i 忽略大小写 注: 在对字母进行去重的时候, 一定要先对文件进行排序之后,去重的功能才可以 ...
- tp5 post接到的json被转义 问题解决
今天做项目的时候前端需要可以保存可变数据, 然后原样返回给前端 接口 $data =input('post.');//用户唯一标识$goods = $data['goods']; $shopcuxia ...
- linux下selenium+phantomjs环境
# 安装依赖软件yum -y install wget fontconfig # 下载PhantomJSwget -P /tmp/ https://bitbucket.org/ariya/phanto ...
- [POI2012]ROZ-Fibonacci Representation (贪心)
大意: 给定数$n$, 求将$n$划分为最少的斐波那契数的和或差. 每次取相邻$n$的斐波那契数一定最优, 考虑证明. 结论1:存在一个最优解,使得每个斐波那契数使用不超过1次.(考虑$2F_n=F_ ...
- 进阶Java编程(1)多线程编程
Java多线程编程 1,进程与线程 在Java语言里面最大的特点是支持多线程的开发(也是为数不多支持多线程的编程语言Golang.Clojure方言.Elixir),所以在整个的Java技术学习里面, ...