构建者模式

代码

package cn.test;

public class Test {
    public static void main(String[] args) {
        //不使用构建者
        Person person = new Person();
        System.out.println("设置field1之前有非常复杂的逻辑");
        person.setField1("name");
        System.out.println("设置field2之前有非常复杂的逻辑");
        person.setField2("age");
        System.out.println("设置field3之前有非常复杂的逻辑");
        person.setField3("gender");
        System.out.println(person);

        System.out.println("-------------------------------");

        //使用构建者
        Person person1 = new PersonConcrete(new Person())
                .setField1("name")
                .setField2("age")
                .setField3("gender")
                .build();
        System.out.println(person1);
    }
}

class Person {
    private String field1;
    private String field2;
    private String field3;

    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }

    public String getField2() {
        return field2;
    }

    public void setField2(String field2) {
        this.field2 = field2;
    }

    public String getField3() {
        return field3;
    }

    public void setField3(String field3) {
        this.field3 = field3;
    }

    @Override
    public String toString() {
        return "Person{" +
                "field1='" + field1 + '\'' +
                ", field2='" + field2 + '\'' +
                ", field3='" + field3 + '\'' +
                '}';
    }
}

interface Builder {
    Builder setField1(String filed1);

    Builder setField2(String filed2);

    Builder setField3(String filed3);

    Person build();
}

class PersonConcrete implements Builder {

    private Person person;

    public PersonConcrete(Person person) {
        this.person = person;
    }

    @Override
    public Builder setField1(String filed1) {
        System.out.println("设置field1之前有非常复杂的逻辑");
        person.setField1(filed1);
        return this;
    }

    @Override
    public Builder setField2(String filed2) {
        System.out.println("设置field2之前有非常复杂的逻辑");
        person.setField2(filed2);
        return this;
    }

    @Override
    public Builder setField3(String filed3) {
        System.out.println("设置field3之前有非常复杂的逻辑");
        person.setField3(filed3);
        return this;
    }

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

输出

设置field1之前有非常复杂的逻辑
设置field2之前有非常复杂的逻辑
设置field3之前有非常复杂的逻辑
Person{field1='name', field2='age', field3='gender'}
-------------------------------
设置field1之前有非常复杂的逻辑
设置field2之前有非常复杂的逻辑
设置field3之前有非常复杂的逻辑
Person{field1='name', field2='age', field3='gender'}

Process finished with exit code 0

总结

构建者模式将构建复杂对象的逻辑剥离开来,放在单独的实现了builder接口的concrete类里来执行,外部实例化的时候通过链式调用来获得对象.

该模式的主要优点如下:

  • 各个具体的建造者相互独立,有利于系统的扩展.
    • 例子中用PersonConcrete类来构建实例,也可以再创建新的StudentConcrete类来构建另一个指定的实例
  • 客户端不必知道产品内部组成的细节,便于控制细节风险.
    • 客户端通过链式调用,不需要内部组成的细节

其缺点如下:

  • 产品的组成部分必须相同,这限制了其使用范围
    • 上例中必须有3个属性field1,field2,field3.
  • 如果产品的内部变化复杂,该模式会增加很多的建造者类
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 创建型模式-构建者模式(生成器模式) 构建者模式为客户返回一个由多个部件组成的复杂产品。 一、构建者模式相关定义 ...
    哈哈大圣阅读 1,722评论 0 0
  • 概念 建造者模式(英:Builder Pattern)是一种创建型设计模式,又名:生成器模式。GOF 给建造者模式...
    niknowzcd阅读 1,898评论 0 0
  • 1.什么是构建者模式以及构建者模式的优点 构建者模式又称建造者模式,其主要功能是将一个复杂的对象的构建和表示进行分...
    海是倒过来的天_67f2阅读 7,893评论 1 0
  • 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 主要作用 在用户不知道对象的建造过...
    虎三呀阅读 2,206评论 0 0
  • 人生如棋局,因为落子无悔,所以步步惊心。有人落子如飞,有人举棋不定,只为了一个结局。胜者,坐拥江山,人间万物为之俯...
    Baby_丹阅读 669评论 0 0