Java设计模式之建造者模式

>>最全面的Java面试大纲及答案解析(建议收藏)  

Java设计模式之建造者模式

在平时的日常生活中,我们往往会去餐馆吃饭,而同一道菜,每次我们去吃都会有不同的味道。就拿中国最有名的菜系“鱼香肉丝”来说,可以吃出千万种味道,不同的餐馆,不同的厨师,不同的时间,做出来的味道可能千差万别。但是我们所熟悉的肯德基、麦当劳、华莱士这些店铺的汉堡、炸鸡,为什么味道相差不大,基本上一样的呢?原因是因为这些门店都有非常规范的工作流程,所以做出来的食品味道也基本上是一样的。

什么是建造者模式?

将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。

建造者模式通常包含以下四种角色:
  1. Builder:为创建一个产品对象的各个部件指定抽象接口。

  2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。

  3. Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

  4. Product:要创建的复杂对象。

建造者模式UML结构图

Java设计模式之建造者模式

建造者模式实例

下面以建造游戏人物为例,游戏人物需要构建头部、身体和四肢。

Product产品类

public class Person {
    private String head;//头部
    private String body;//身体
    private String limbs;//四肢

    public String getHead() {
        return head;
    }

    public void setHead(String head) {
        this.head = head;
    }

    public String getBody() {
        return body;
    }

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

    public String getLimbs() {
        return limbs;
    }

    public void setLimbs(String limbs) {
        this.limbs = limbs;
    }
}

抽象接口Builder类

public interface Builder {
    public void buildHead();

    public void buildBody();

    public void buildLimbs();

    public Person buildPerson();

}

ConcreteBuilder类

public class PersonBuilder implements Builder {

    private Person person;

    public PersonBuilder() {
        person = new Person();
    }

    @Override
    public void buildHead() {
        person.setHead("这是头部");
    }

    @Override
    public void buildBody() {
        person.setBody("这是身体");
    }

    @Override
    public void buildLimbs() {
        person.setLimbs("这是四肢");
    }

    @Override
    public Person buildPerson() {
        return person;
    }
}

指挥者Director类

public class Director {

    public Person constructPerson(Builder builder) {
        builder.buildHead();
        builder.buildBody();
        builder.buildLimbs();
        return builder.buildPerson();
    }
}

客户端实现类BuilderTest

public class BuilderTest {
    public static void main(String[] args) {

        Director director = new Director();
        Person person = director.constructPerson(new PersonBuilder());
        System.out.println("头部:" + person.getHead());
        System.out.println("身体:" + person.getBody());
        System.out.println("四肢:" + person.getLimbs());
    }

}

测试结果如下所示:

Java设计模式之建造者模式

建造者模式的应用场景(StringBuilder)

StringBuilder中使用了建造者模式。 StringBuilder把构建者的角色交给了其的父类AbstractStringBuilder。

代码如下所示:

StringBuilder(指导者)
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.SerializableCharSequence
{
}
AbstractStringBuilder(抽象类)

Java设计模式之建造者模式


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设计模式之建造者模式