前言

建造者模式也是一种很常见也很实用的模式,下面简单记录一下,方便自己回顾和查阅。

正文

建造者模式

‌建造者模式(Builder Pattern)是一种创建型设计模式,旨在将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示‌。

这种模式通过多个步骤构建一个复杂对象,每个步骤可以独立变化,从而简化初始化复杂对象的创建过程。‌

适用场景

  1. 创建的对象具有复杂的内部结构以及对象组成算法独立。

  2. 创建的对象内部属性本身相互依赖。

比如:造汽车,无论是什么牌子的汽车都好包含轮胎,发动机、底盘、变速箱、车身等独立子对象组成。这些子对象组合起来才是一个完整的汽车对象。

四个主要角色

  1. Product :产品角色,一个具体的产品对象

  2. Builder:抽象的建造者,创建一个Product对象的各个部件的指定的接口和抽象类

  3. ConcreateBuilder:具体的构建者,实心接口,构建和装配各个部件

  4. Director:指挥者,构建一个使用Builder接口的对象,主要是创建一个复杂的对象。

    有两个作用:

    1. 隔离客户端与对象的生产的过程

    2. 负责控制产品对象的生产过程

设计模式之建造者模式

demo

案例:策划出版作者书籍。书籍信息包括书名,页码书,售价组成。

产品角色

也就是Product ,一个具体的产品对象。

我们这里是出版书。

public class Book {
    private String name;
    private int page;
    private float value;

    public void setName(String name) {
        this.name = name;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public void setValue(float value) {
        this.value = value;
    }

    @NonNull
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", page=" + page +
                ", value=" + value +
                '}';
    }
}
抽象建造者

也就是Builder,创建一个Product对象的各个部件的指定的接口和抽象类。

抽象的方便,用于创建不同的组成部分。

public abstract class Builder {
    public abstract void builderName();
    public abstract void builderPage();
    public abstract void builderValue();
    public abstract Book builder();
}
具体的构建者

也就是ConcreateBuilder,实现Build接口,构建和装配各个部件。

不同书籍,是做不同的构建者。

比如出版鲁迅的《呐喊》,为了方便,以作者名命名。

/**
 * 鲁迅 呐喊
 */
public class LuXunBook extends Builder {
    private final Book book = new Book();

    @Override
    public void builderName() {
        book.setName("呐喊");
    }

    @Override
    public void builderPage() {
        book.setPage(128);
    }

    @Override
    public void builderValue() {
        book.setValue(19.9f);
    }

    @Override
    public Book builder() {
        return book;
    }
}

又比如出版路遥的《平凡的世界》

/**
 * 路遥 平凡的世界
 */
public class LuYaoBook extends Builder {
    private final Book book = new Book();

    @Override
    public void builderName() {
        book.setName("平凡的世界");
    }

    @Override
    public void builderPage() {
        book.setPage(528);
    }

    @Override
    public void builderValue() {
        book.setValue(39.9f);
    }

    @Override
    public Book builder() {
        return book;
    }
}
指挥者

也就是Director,构建一个使用Builder接口的对象,主要是创建一个复杂的对象。

public class Director {
    private Builder builder;
    public void setBuilder(Builder builder){
        this.builder = builder;
    }
    public Book buildBook(){
        builder.builderName();
        builder.builderPage();
        builder.builderValue();
        return builder.builder();
    }
}

传入具体的构建者进行创建。

客户端

也就是如何使用。

//初始化指挥者
Director director = new Director();

//出版路遥的书
director.setBuilder(new LuYaoBook());
Book luyaoBook = director.buildBook();

//出版鲁迅的书
director.setBuilder(new LuXunBook());
Book luxunBook= director.buildBook();

优缺点

优点
  • 封装性‌:创建和使用分离。‌

  • 灵活性‌:允许通过不同的建造者实现创建不同表示的对象。‌

  • 扩展性‌:创建类之间独立,一定程度上解耦。‌

缺点
  • 性能开销‌:每次构建都需要重新实例化对象,会影响性能。

  • 额外的类‌:需要创建更多的类文件,增加了系统的复杂性。

代码改进

上面的建造者模式没有出现这个build的链式调用,并且需要一个这个指挥者Director类操作这个Builder类,因此对这两个方面进行一个优化。

修改后如下:

public class Book {
    private final String name;
    private final int page;
    private final float value;

    private Book(Builder builder) {
        this.name = builder.name;
        this.page = builder.page;
        this.value = builder.value;
    }

    public float getValue() {
        return value;
    }

    public int getPage() {
        return page;
    }

    public String getName() {
        return name;
    }

    public static class Builder {
        private String name;
        private int page;
        private float value;

        public Builder setName(String name) {
            this.name = name;
            return this;
        }

        public Builder setPage(int page) {
            this.page = page;
            return this;
        }

        public Builder setValue(float value) {
            this.value = value;
            return this;
        }

        public Book builder() {
            return new Book(this);
        }
    }
}

客户端调用

Book luyaoBook = new Book.Builder().setName("平凡的世界").setPage(528).setValue(39.9f).builder();
Book luxunBook = new Book.Builder().setName("呐喊").setPage(128).setValue(19.9f).builder();

课外知识

下面是Android中常用的构建模式类。

AlertDialog
AlertDialog.Builder builder = new AlertDialog.Builder(this);
OkHttpClient
String url = "http://wwww.biumall.com";
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
        .url(url)
        .get()
        .build();
Call call = okHttpClient.newCall(request);
StringBuilder
String result = new StringBuilder().append("biumall.com").reverse().toString();

参考文章

  1. java设计模式—建造者模式

  2. Java设计模式 —— 【创建型模式】建造者模式详解

  3. 设计模式内容分享(三):构造器模/建造者模式

相关文章

暂无评论

none
暂无评论...