设计模式(二)—— Builder模式
基于《Android 源码设计模式 解析与实战》第二版(何红辉 关爱民 著)的学习笔记
定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
使用场景
- 通过相同方法,不同执行顺序产生不同结果时使用
- 多个部件或零件,都可装配到一个对象中,但产生的运行结果不同时
- 产品类非常复杂,或产品类中的调用顺序不同产生不同作用
- 初始化一个复杂对象,如参数多,且很多参数有默认值时
角色
- Builder —— 抽象Builder类,规范产品的组建,一般是由子类实现具体的组件过程
- ConcreteBuilder —— 具体的Builder类
- Director —— 统一组装过程
特点
Builder模式是一步一步创建一个复杂对象的创建型模式。其允许用户在不知道内部构件细节的情况下,可以更精细地控制对象的构建流程。该模式是为了将构建复杂对象的过程与其部件解耦,隔离其构建过程和部件的表示
实现方式
简单实现
通过具体的Builder
来构建Product
产品对象。由Direcor
与Builder
一同将一个复杂对象与其表示分离。
实际开发中,经常会省略Director
类,直接使用一个Builder
进行组装。该Builder
通常为链式调用。这种方式能使整个结构更为简单
//抽象产品类
abstract class Product {
protected String s1; //属性1
protected String s2; //属性2
protected String s3; //属性3
protected Product(){}
void setS1(String s1) {
this.s1 = s1;
}
void setS2(String s2) {
this.s2 = s2;
}
void setS3(String s3) {
this.s3 = s3;
}
}
//具体产品类
class ProductWrap {
protected ProDuctWrap(){}
}
//抽象Builder类
abstract class Builder {
//构建属性1
abstract void buildS1(String s1);
//构建属性2
abstract void buildS1(String s1);
//构建属性3
abstract void buildS1(String s1);
//构建方法
abstract Product create();
}
//Director类,负责构建
class Director {
Builder mBuilder = null;
public Director(Builder builder) {
mBuilder = builder;
}
public void construct(String s1, String s2, String s3) {
mBuilder.buildS1(s1);
mBuilder.buildS1(s2);
mBuilder.buildS1(s3);
}
}
//测试类
class Test {
void test(){
Builder builder = new Builder(){
Product product = new ProductWrap();
@Override
void buildS1(String s1){
product.setS1(s1);
}
@Override
void buildS2(String s2){
product.setS1(s2);
}
@Override
void buildS3(String s3){
product.setS1(s3);
}
@Override
Product create(){
return product;
}
}
Director director = new Director(builder);
director.construct("1", "2", "3");
}
}
链式
省略Director
,直接使用Builder
。也算是我比较喜欢的类型
//产品类
class Product {
private String s1;
private int i2;
private Product(){}
class Builder {
private Product product;
Builder setS1(String s1){
product.s1 = s1;
return this;
}
Builder setI1(int i2){
product.i2 = i2;
return this;
}
Product create(){
return product;
}
}
}
//测试类
class Test {
void test(){
Product product = new Product.Builder()
.setS1("1").setI1(1)
.create()
}
}
直接简洁了许多许多,而且是不是看起来很像AlertDialog
?