Java设计模式——Builder模式

时间:2020-12-17 20:18:44

构建者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

使用场景

1、相同的方法,不同的执行顺序,产生不同的事件结果时。
2、多个产品或者零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
3、产品类非常复杂或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常合适。
4、当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时。

角色划分

产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。
抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。

类图

Java设计模式——Builder模式

代码示例

产品角色:Person

public class Person {

    private String partHead;

    private String partBody;

    private String partFoot;

    public String getPartHead() {
        return partHead;
    }

    public void setPartHead(String partHead) {
        this.partHead = partHead;
    }

    public String getPartBody() {
        return partBody;
    }

    public void setPartBody(String partBody) {
        this.partBody = partBody;
    }

    public String getPartFoot() {
        return partFoot;
    }

    public void setPartFoot(String partFoot) {
        this.partFoot = partFoot;
    }
}

抽象构建者:IBuilder

public interface IBuilder {

    public void buildPartHead();

    public void buildPartBody();

    public void buildPartFoot();

    public Person getResult();

}

具体构建者:PersonBuilder

public class PersonBuilder implements IBuilder {

    private Person person;

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

    @Override
    public void buildPartHead() {
        person.setPartHead("head");
    }

    @Override
    public void buildPartBody() {
        person.setPartBody("body");
    }

    @Override
    public void buildPartFoot() {
        person.setPartFoot("foot");
    }

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

导演角色:Director

public class Director {

    private IBuilder personBuilder;

    public Director(IBuilder personBuilder) {
        this.personBuilder = personBuilder;
    }

    public Person constructPerson() {
        personBuilder.buildPartHead();
        personBuilder.buildPartBody();
        personBuilder.buildPartFoot();
        return personBuilder.getResult();
    }
}

在BuilderTest中使用PersonBuilder 、Director 构建出一个Person

public class BuilderTest {
    public static void main(String[] args) {
        PersonBuilder builder = new PersonBuilder();
        Director director = new Director(builder);
        Person person = director.constructPerson();
        System.out.println(person.getPartHead());
        System.out.println(person.getPartBody());
        System.out.println(person.getPartFoot());
    }
}

运行结果:
head
body
foot