目录
前言
建造者模式也是一种很常见也很实用的模式,下面简单记录一下,方便自己回顾和查阅。
正文
建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,旨在将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
这种模式通过多个步骤构建一个复杂对象,每个步骤可以独立变化,从而简化初始化复杂对象的创建过程。
适用场景
创建的对象具有复杂的内部结构以及对象组成算法独立。
创建的对象内部属性本身相互依赖。
比如:造汽车,无论是什么牌子的汽车都好包含轮胎,发动机、底盘、变速箱、车身等独立子对象组成。这些子对象组合起来才是一个完整的汽车对象。
四个主要角色
Product :产品角色,一个具体的产品对象
Builder:抽象的建造者,创建一个Product对象的各个部件的指定的接口和抽象类
ConcreateBuilder:具体的构建者,实心接口,构建和装配各个部件
Director:指挥者,构建一个使用Builder接口的对象,主要是创建一个复杂的对象。
有两个作用:
隔离客户端与对象的生产的过程
负责控制产品对象的生产过程
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();
参考文章
《》
《》
《