Android-Builder模式

本文探讨了Android开发中Builder模式的运用,通过OkHttp和AlertDialog的例子展示其简洁直观的特点。Builder模式允许创建复杂对象并分离构建过程与表示,便于创建不同表示。文中以Person类为例解释Builder模式,并分析了OKHttp的Request构建过程,强调Builder类如何通过赋值方法和构造函数实现对象创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android里很多对象的构建都用到了Builder,比如OkHttp和AlertDialog,看起来特别简洁直观。

Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();

网上的定义如下

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

这里写图片描述

下面举个例子来看看

过年嘛,被问的最多的就是为毛还单身,,单身狗说多了都是泪啊,怕什么!!我写java,我还怕没对象?!我现在就来创建一个

Person类

public abstract class Person {

    protected int age;
    protected String hobby;
    protected String character;

    public Person() {

    }

    public abstract void setAge(int age);
    public abstract void setHobby(String hobby);
    public abstract void setCharacter(String character);
}

Boyfriend

public class Boyfriend extends Person {

    public Boyfriend() {

    }

    @Override
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    @Override
    public void setCharacter(String character) {
        this.character = character;
    }

    @Override
    public String toString() {
        String string = "boyfriend: age = " + age + "\nhobby=" + hobby + "\ncharacter=" + character;
        return string;
    }

}

Builder

public abstract class Builder {
    public abstract Builder buildAge(int age);
    public abstract Builder buildHobby(String hobby);
    public abstract Builder buildCharacter(String character);

    public abstract Person create();
}

BoyfriendBuilder

public class BoyFriendBuilder extends Builder {

    private Boyfriend boyfriend;

    public BoyFriendBuilder() {
        boyfriend = new Boyfriend();
    }

    @Override
    public Builder buildAge(int age) {
        boyfriend.setAge(age);
        return this;
    }

    @Override
    public Builder buildHobby(String hobby) {
        boyfriend.setHobby(hobby);
        return this;
    }

    @Override
    public Builder buildCharacter(String character) {
        boyfriend.setCharacter(character);
        return this;
    }

    @Override
    public Person create() {
        return boyfriend;
    }

}

最后建个SingleDog来测试下

public class SingleDog {

    public static void main(String[] args) {
        Person boyfriend = new BoyFriendBuilder()
                        .buildAge(20)
                        .buildCharacter("gentle")
                        .buildHobby("coding")
                        .create();
        System.out.println(boyfriend.toString());
    }

}

输出:

boyfriend: age = 20
hobby=coding
character=gentle

哼!我也是个有对象的人,想建几个建几个,还有可以添加各种属性。╭(╯^╰)╮

OKHttp中的Builder模式

OKHttp的使用

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
Response response = client.newCall(request).execute();

看一下Request的代码

public final class Request {

  private Request(Builder builder) {
    this.url = builder.url;
    this.method = builder.method;
    this.headers = builder.headers.build();
    this.body = builder.body;
    this.tag = builder.tag != null ? builder.tag : this;
  }

    //...

  public static class Builder {
    private HttpUrl url;
    private String method;
    private Headers.Builder headers;
    private RequestBody body;
    private Object tag;

    public Builder() {
      this.method = "GET";
      this.headers = new Headers.Builder();
    }

    private Builder(Request request) {
      this.url = request.url;
      this.method = request.method;
      this.body = request.body;
      this.tag = request.tag;
      this.headers = request.headers.newBuilder();
    }

    public Builder url(HttpUrl url) {
      if (url == null) throw new IllegalArgumentException("url == null");
      this.url = url;
      return this;
    }

    //...

    public Builder tag(Object tag) {
      this.tag = tag;
      return this;
    }

    public Request build() {
      if (url == null) throw new IllegalStateException("url == null");
      return new Request(this);
    }
  }
}

Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)。再将这个builder对象传递给在build()中创建的request,request利用这个Builder设置各种参数。

定义一个静态内部类Builder,内部的成员变量和外部类一样
Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)
Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder
外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值

参考文章:Android源码分析之Builder模式
Android开发中无处不在的设计模式——Builder模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值