设计模式4:建造者模式

本文目录

  • 建造者模式的目的或者好处是什么?
  • 建造者模式的特点是什么?
  • 什么情况下使用建造者模式?
  • 标准的建造者模式
  • 建造者模式与工厂模式的区别是什么?
  • 建造者模式在哪些地方用到?
      • 1. StringBuilder
      • 2. Okhttp的Request
      • 3. EventBus创建可配置对象

建造者模式的目的或者好处是什么?

将一个复杂对象的构建与其表现(功能)分离,使得同样的构建过程可以创建不同的表现(功能)。
秒懂设计模式之建造者模式(Builder pattern)

建造者模式的特点是什么?

把对象初始化的过程放在一个Builder类中,通过Builder.build()方法,生成目标对象。

什么情况下使用建造者模式?

要创建的对象,初始化过程比较复杂,参数较多,参数又是可选可配置的。

标准的建造者模式

  1. Builder(抽象建造者)
  2. ConcreteBuilder(具体建造者)
  3. Product(具体产品)
  4. Director(指挥者)

实际应用中,可能不按照这个标准来,比如Okhttp和EventBus。

建造者模式与工厂模式的区别是什么?

建造者模式的目的是通过Builder类创建可配置的对象。
工厂模式更加宏观一些,工厂模式主要目的的是通过不同的工厂,得到不同种类的产品。
具体某个工厂是如何生产产品的,如果比较复杂,可以采用建造者模式。所以建造者模式和工厂模式,并不冲突。

建造者模式在哪些地方用到?

1. StringBuilder

java.lang.Appendable

public interface Appendable {

    Appendable append(CharSequence csq) throws IOException;

    Appendable append(CharSequence csq, int start, int end) throws IOException;

    Appendable append(char c) throws IOException;
}

java.lang.AbstractStringBuilder

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    
    @Override
    public AbstractStringBuilder append(CharSequence s) {
        ...
    }

    @Override
    public AbstractStringBuilder append(CharSequence s, int start, int end) {
        ...
    }

    @Override
    public AbstractStringBuilder append(char c) {
        ...
    }
    
    @Override
    public abstract String toString();    
}

java.lang.StringBuilder

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{

    @Override
    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }

    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
    ...
}

这里重点是建造者模式,对于StringBuilder不做深入分析。
以上代码只是分析,在实际应用中用String,还是用StringBuilder,StringBuffer,还是要具体情况具体分析。

从JDK中学习设计模式——建造者模式

2. Okhttp的Request

在这篇:Okhttp系列:简单的不用传参的Get请求示例 中写了一个简单的网络请求,可以看到,Okhttp的request是通过Builder生成的。

                String url = "https://publicobject.com/helloworld.txt";
                OkHttpClient client  = new OkHttpClient();
                //通过Builder创建请求体
                Request request = new Request.Builder().url(url).get().build();
                //执行请求
                Response response = null;
                try {
                    response = client.newCall(request).execute();
                    //获取服务器响应数据
                    if (response.isSuccessful()) {
                        String result = response.body().string();
                        Log.e("xxx", result);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

3. EventBus创建可配置对象

EventBus不仅可以创建单例对象,还可以创建可配置对象,这种情况应用的少。从EventBus官方文档中,复制一段代码:

EventBus eventBus = EventBus.builder()
    .logNoSubscriberMessages(false)
    .sendNoSubscriberEvent(false)
    .build();

那如果我们既想配置上面的选项,又想获得单例模式,怎么办了?
使用installDefaultEventBus()

EventBus eventBus = EventBus.builder()
    .logNoSubscriberMessages(false)
    .sendNoSubscriberEvent(false)
    .installDefaultEventBus();

installDefaultEventBus()方法是EventBusBuilder.java里面的,具体源码分析参考:EventBus设计模式剖析(二)建造者模式

你可能感兴趣的:(设计模式,设计模式,建造者模式,okhttp)