狐彻设计模式学习笔记(二)—— Builder模式

it2023-10-11  76

设计模式(二)—— 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?

最新回复(0)