Hello,大家好!今天所要介绍的设计模式是建造者模式,它是一种创造型模式,也被称为构建者模式和生成器模式。个人觉得建造者模式比较简单,因此本文主要以代码为主。
一、什么是建造者模式?
1.1 建造者模式的概述
个人认为,建造者模式就是把创建一个复杂的对象的过程拆分成多个步骤,然后从一个简单的对象一步一步的构建成复杂的对象。比如我们创建一个汽车,在构建的时候会有很多个步骤,例如安装底盘、车轮、后视镜、发动机、车顶等。我们可以把这些步骤分开,先创建一个抽象的汽车,然后一步一步的给这个汽车添加部件,最后把这个汽车返回出去。
1.2 建造者模式的好处
那么,这样会有什么好处呢?因为我们构建的部件是一个一个增加的,那么我们就可以给一个抽象的汽车类装上不同车轮,譬如米其林、双星的车轮(或者其他部件),这样我们就可以构建出很多个不同种类的汽车。
也就是说,建造者模式可以将复杂对象的构建过程与它的表示方式相分离。这样在相同的构建过程中,我们能够创建出不同的表示方式。
1.3 建造者模式的关键角色
- 产品:表示将要被构建的复杂对象。
- 抽象创建者:定义构建产品的接口,通常包含创建和获取产品的方法。
- 具体创建者:实现抽象创建者定义的接口,为产品的各个部分提供具体实现。
- 指挥者:负责调用具体创建者来构建产品的各个部分,控制构建过程。
二、建造者模式的实现
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>
}
}