Hello,大家好!今天所要介绍的设计模式是建造者模式,它是一种创造型模式,也被称为构建者模式和生成器模式。个人觉得建造者模式比较简单,因此本文主要以代码为主。

一、什么是建造者模式?

1.1 建造者模式的概述

个人认为,建造者模式就是把创建一个复杂的对象的过程拆分成多个步骤,然后从一个简单的对象一步一步的构建成复杂的对象。比如我们创建一个汽车,在构建的时候会有很多个步骤,例如安装底盘、车轮、后视镜、发动机、车顶等。我们可以把这些步骤分开,先创建一个抽象的汽车,然后一步一步的给这个汽车添加部件,最后把这个汽车返回出去。

1.2 建造者模式的好处

那么,这样会有什么好处呢?因为我们构建的部件是一个一个增加的,那么我们就可以给一个抽象的汽车类装上不同车轮,譬如米其林、双星的车轮(或者其他部件),这样我们就可以构建出很多个不同种类的汽车。

也就是说,建造者模式可以将复杂对象的构建过程与它的表示方式相分离。这样在相同的构建过程中,我们能够创建出不同的表示方式。

1.3 建造者模式的关键角色

  1. 产品:表示将要被构建的复杂对象。
  2. 抽象创建者:定义构建产品的接口,通常包含创建和获取产品的方法。
  3. 具体创建者:实现抽象创建者定义的接口,为产品的各个部分提供具体实现。
  4. 指挥者:负责调用具体创建者来构建产品的各个部分,控制构建过程。

二、建造者模式的实现

2.1 场景

假设我们要创建一个Html文档,一个HTML的内容一般包括头部、正文、尾部。

2.2 产品类

public class HtmlDocument {
    private String header = "";
    private String body = "";
    private String footer = "";

    public void addHeader(String header) {
        this.header = header;
    }

    public void addBody(String body) {
        this.body = body;
    }

    public void addFooter(String footer) {
        this.footer = footer;
    }

    @Override
    public String toString() {
        return "<html><head>" + header + "</head><body>" + body + "</body><footer>" + footer + "</footer></html>";
    }
}

2.3 抽象创建者类

public abstract class HtmlDocumentBuilder {
    protected HtmlDocument document;

    public HtmlDocument getDocument() {
        return document;
    }

    public void createNewHtmlDocument() {
        document = new HtmlDocument();
    }

    public abstract void buildHeader();
    public abstract void buildBody();
    public abstract void buildFooter();
}

2.4 具体创建者类

public class ArticleHtmlDocumentBuilder extends HtmlDocumentBuilder {

    @Override
    public void buildHeader() {
        document.addHeader("Article Header");
    }

    @Override
    public void buildBody() {
        document.addBody("Article Body");
    }

    @Override
    public void buildFooter() {
        document.addFooter("Article Footer");
    }
}

2.5 指挥者类

public class HtmlDirector {
    private HtmlDocumentBuilder builder;

    public HtmlDirector(HtmlDocumentBuilder builder) {
        this.builder = builder;
    }

    public void constructDocument() {
        builder.createNewHtmlDocument();
        builder.buildHeader();
        builder.buildBody();
        builder.buildFooter();
    }

    public HtmlDocument getDocument() {
        return builder.getDocument();
    }
}

2.6 客户端

public class Main {
    public static void main(String[] args) {
        // 创建创建者
        HtmlDocumentBuilder htmlDocumentBuilder = new ArticleHtmlDocumentBuilder();
        // 创建指挥者
        HtmlDirector director = new HtmlDirector(htmlDocumentBuilder);
        // 指挥者指挥构建产品
        director.constructDocument();
        // 产生的产品
        HtmlDocument document = director.getDocument();

        System.out.println(document.toString());
        // <html><head>Article Header</head><body>Article Body</body><footer>Article Footer</footer></html>
    }
}

天行健,君子以自强不息