设计模式:Builder
简介
建造者模式(Builder),将一个复杂对象的表示和它的构建分离,这样同样的构造过程可以创建出不同的对象状态。
类图
下面的Product是要创建的对象的目标类型,产品。

Builder
创建一个Product对象涉及的操作的抽象接口,定义了Product各个部分的创建方法。Director
使用Builder来构建Product,控制构建过程。ConcreteBuilder
一个具体的构建者。
样例代码
目标类型Robot
假设要构建一个机器人Robot类型的对象:
public class Robot {
private String head;
private String arm;
private String leg;
private String body;
// getter & setter 省略
public String getDescription() {
return toString();
}
@Override
public String toString() {
return "Robot{" +
"head='" + head + '\'' +
", arm='" + arm + '\'' +
", leg='" + leg + '\'' +
", body='" + body + '\'' +
'}';
}
}
RobotBuilder
使用RobotBuilder接口(也可以是抽象类)来定义Robot各个部分的设置。
public interface RobotBuilder {
void setArm();
void setLeg();
void setBody();
void setHead();
}
具体的RobotBuilder
可以定义不同RobotBuilder子类来实现不同的Robot的构建。
BigRobotBuilder
构建一个“Big Robot”的建造器如下:
public class BigRobotBuilder implements RobotBuilder {
private Robot mRobot;
public BigRobotBuilder(Robot robot) {
mRobot = robot;
}
@Override
public void setArm() {
mRobot.setArm("Big arm");
}
@Override
public void setLeg() {
mRobot.setLeg("Big leg");
}
@Override
public void setBody() {
mRobot.setBody("Big body");
}
@Override
public void setHead() {
mRobot.setHead("Big head");
}
}
MiniRobotBuilder
构建一个“Mini Robot”的建造器如下:
public class MiniRobotBuilder implements RobotBuilder {
private Robot mRobot;
public MiniRobotBuilder(Robot robot) {
mRobot = robot;
}
@Override
public void setArm() {
mRobot.setArm("Mini arm");
}
@Override
public void setLeg() {
mRobot.setLeg("Mini leg");
}
@Override
public void setBody() {
mRobot.setBody("Mini body");
}
@Override
public void setHead() {
mRobot.setHead("Mini head");
}
}
RobotBuildDirector
控制Robot构建过程的指挥者:
public class RobotBuildDirector {
public void buildRobot(RobotBuilder builder) {
builder.setBody();
builder.setArm();
builder.setHead();
builder.setLeg();
}
}
如果构建过程需要严格顺序的话,那么Director来封装具体构建过程是很重要的。
调用代码
创建一个具体的builder,然后执行Director.buildRobot()来完成构建:
void main() {
Robot robot = new Robot();
RobotBuildDirector director = new RobotBuildDirector();
RobotBuilder builder = new BigRobotBuilder(robot);
director.buildRobot(builder);
// 显示已构建的robot的详细信息
Log.println(robot.getDescription());
}
小结
以上的Robot案例展示了builder模式的标准形式。
实际使用中,可能没有抽象Builder和Director控制过程这样的需要。
而是,仅仅希望将包含很多可设置的属性的类型的构建相关的代码与类型本身分开。
而且,设置属性的类往往就作为要配置的类的子类。
下面的实际案例中会说明这点。
实际案例
Diaglog
在Android开发中,AlertDialog类型的构建就使用到了Builder模式,而且是简化了的。
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
AlertDialog dialog = dialogBuilder.setIcon(R.drawable.ic_launcher)
.setMessage("message")
.setTitle("Title")
.setNegativeButton("Cancel", null)
.create();
内部类AlertDialog.Builder用来对AlertDialog的不同的属性进行设置。
注意到setMessage()、setTitle()等方法都返回AlertDialog.Builder对象本身,
这样就可以以“链式代码”的形式对多个属性进行设置。这样的api很常见,如:
StringBuilder sb = new StringBuilder();
sb.append(1).append(2).append(2);
再如:
SharedPreferences sp = getSharedPreferences("1", MODE_PRIVATE);
sp.edit().putBoolean("1", false)
.putInt("2", 2)
.putLong("3", 3L)
.remove("2")
.apply();
可以看到,Builder对外暴露实际要使用的AlertDialog的各种属性的设置,而且它可以提供一些默认配置。这样使用者就无需每个属性都去指定。
当调用者完成对AlertDialog的一些方面的定制后,执行create()返回最终的dialog对象。
其它例子
Notification也是:
Notification.Builder builder = new Notification.Builder(this);
Notification.Action action = null;
String category = "";
builder.addAction(action)
.setCategory(category)
.setColor(0xff00ff00)
.setNumber(10086)
.setGroup("groupKey")
.build();
其它一些第三方库,或者非Android框架中也有类似Builder模式的大量运用,贵在积累和学习。
总结
可以看到,实际使用中的builder模式和标准的模式组成稍微不同。
很多已知的API中,对构建着模式的使用就是:
将一个包含很多不同属性的对象的设置相关逻辑封装为一个静态内部类去完成。
(本文使用Atom编写)
设计模式:Builder的更多相关文章
- 设计模式Builder(建造者)模式
1.出现原因 在软件系统中,有时候会面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂的对象的各个部分可能面临着剧烈的变化,但是把他们组合在一起的算法 ...
- 设计模式-----Builder模式
前言 近日,看到Myabtis中组件中SqlSessionFactory由SqlSessionFactoryBuilder().build()生成时,且采用Builder模式,遂记录学习之. SqlS ...
- java设计模式--Builder模式
一.Builder模式 二.使用例子 三.Spring中的Builder模式 Builder模式,构建者.构造者模式,在<图解设计模式>中归为 生成实例 一栏,该模式用于组装具有复杂结构的 ...
- 设计模式-Builder和Factory模式区别
Builder和Factory模式区别 Builder模式结构: Factory模式一进一出,Builder模式是分步流水线作业.当你需要做一系列有序的工作或者按照一定的逻辑来完成创建一个对象时 Bu ...
- 设计模式-Builder模式(创建型模式)
//以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Product.h #pragma once class Product { public: Product(); ~ ...
- Java设计模式-Builder构造者模式
介绍: 构造者模式,又称之为建造者模式,建造者模式,单例模式以及工厂模式都属于创建型模式1应用场景 今天学mybatis的时候,知道了SQLSessionFactory使用的是builder模式来生成 ...
- 一天一个设计模式——Builder建造者模式
一.模式说明 在现实世界中,当我们要构造一个大型工程时(建一个大楼),通常的做法是先建造工程的每个独立部分,然后再逐步构造完成(先打地基,再搭框架,最后逐层累造).在程序设计领域,构造一个复杂的类时( ...
- C++设计模式-Builder建造者模式
作用:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式和AbstractFactory模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:B ...
- Java设计模式-Builder生成器模式
概念: 生成器模式也称之为建造者模式.生成器模式的意图在于将一个复杂的构建与其表示相分离,构建与产品分离. UML: Ibuild接口清晰地反映了创建产品Product的流程. 生成器模式涉及4个关键 ...
- java的设计模式 - Builder模式
Builder 模式的目的? 构造对象的方式过于复杂,不如将之抽离出来.比如,构造器参数过多 这样说也有点抽象,举个例子吧. 举个例子 比如 非常热门的消息队列RabbitMQ 的 AMQP.Basi ...
随机推荐
- ubuntu14简介/安装/菜鸟使用手册
Linux拥有众多的发行版,可以分为两大类商业版和开源社区免费版.商业版以Radhat为代表,开源社区版以debian为代表. 简单的比较ubuntu与centos. Ubuntu 优点:丰富的 ...
- clion配置c/c++环境
打开这个界面 点击添加Cygwin选择下载的Cygwin在进行下面的配置 去网站https://www.cygwin.com/选择路径即可(这里只写了配置过程中的关键步骤并且附上IDE的链接直接安装 ...
- java.lang.NoClassDefFoundError: org/apache/solr/common/params/SolrParams
启动tomcat服务,报错误java.lang.NoClassDefFoundError: org/apache/solr/common/params/SolrParams [2016-03-10 2 ...
- 将excel的数据导入到数据库后都乱码了是怎么回事
将excel内容首先保存成csv格式,然后在MySQL数据库中导入,结果汉字出现了乱码. 解决过程: 1.csv文件以txt形式打开,另存为,选择utf-8编码. 2.数据库,设置,collation ...
- 2019.01.26 codeforces 1096G. Lucky Tickets(生成函数)
传送门 题意简述:现在有一些号码由000~999中的某些数字组成(会给出),号码总长度为nnn,问有多少个号码满足前n2\frac n22n个数码的和等于后n2\frac n22n个数码的和(保证 ...
- 关于矩阵A*b=A*c 中b是否等于c
注意如果A各列线性无关那么b=c,反之b!=c, 针对最小二乘中的 p=A * roof_x A' ( b-p)=0 => A'b =A' p 如果 两边同乘以A , ...
- Win7 qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包
今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库问题 网上搜了下可以简单粗暴的用 D:\Qt\Qt5.6.0\5.6\msvc2015\bin ...
- s5-1 CPU调度
基本概念 通过多道程序设计得到 CPU 的最高利用率 (CPU-- I/O 脉冲周期 - - 进程的执行包括进程在 CPU 上执行和等待 I/O ) 进程的执行以 CPU 脉冲开始,其后跟着 I/O ...
- centos6上安装jenkins
一.安装jdk 1.下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...
- VMware14 安装CentOS7及其配置;CentOS7配置网桥,做远程连接;
1.VMware14安装 进入百度链接,按照图形安装就好了.https://jingyan.baidu.com/article/9f7e7ec09da5906f281554d6.html ...