加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

玩转Java设计模式之建造者模式

发布时间:2023-06-16 14:06:41 所属栏目:教程 来源:
导读:建造者模式
Separate the construction of a complex object from its representation, allowing the same construction process to create varIoUs representations.

将复杂对象的构造与其表现分离,允许相同的
建造者模式
Separate the construction of a complex object from its representation, allowing the same construction process to create varIoUs representations.

将复杂对象的构造与其表现分离,允许相同的构造过程用来创建不同的表现。通俗点就是,一个对象创建过程很复杂,我们将其每项元素创建过程抽离出来,通过相同的构造过程可以构造出不用的对象。还不懂可以看到如下的UML图。

建造者模式UML图
折腾Java设计模式之建造者模式cdn.xitu.io/2019/4/15/16a1ea2ba7ee7824?w=1080&h=1145&f=jpeg&s=130365">

此AbstractPersonBuilder就是如上的相同的构造,而不同的表现就是此处的PersonOneBuilder和PersonTwoBuilder两个相同方式的构造器,但是具体的实现是不一样而构造出不同的表现。所以就是相同的构造过程而构造出不同的对象。

建造者模式角色
抽象建造者(AbstractPersonBuilder或者Builder):抽象类或者接口,复杂对象的属性的抽象方法,并不涉及具体的对象部件的创建;

具体建造者(PersonOneBuilder和PersonTwoBuilder):实现抽象建造者,针对不同的业务,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例;

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

具体的产品(Person):需创建的复杂对象;

建造者模式源码干货
源码地址:请点击我

在这里我分为三种情况讲讲建造者模式,第一种是我们最原始的建造者模式来构建,第二种是我们在实体对象时会使用的,第三种是我们平常对实体对象最常规使用方法借助lombok。

第一种建造者模式
使用的真是上面按照角色来建造的方式,稍微比如下的两种方法负责点。

抽象建造者

public abstract class AbstractPersonBuilder {
    protected Person product = new Person();
    public abstract void buildName();
    public abstract void buildAge();
    public abstract void buildChildren();
    public Person build() {
        return product;
    }
}
第一个具体建造者

public class PersonOneBuilder extends AbstractPersonBuilder {
    public void buildName() {
        product.setName("老one");
    }
    public void buildAge() {
        product.setAge(44);
    }
    public void buildChildren() {
        product.setChildren(Lists.newArrayList("小one"));
    }
}
第二个具体建造者

public class PersonTwoBuilder extends AbstractPersonBuilder {
    public void buildName() {
        product.setName("老two");
    }
    public void buildAge() {
        product.setAge(55);
    }
    public void buildChildren() {
        product.setChildren(Lists.newArrayList("小two"));
    }
}
Person类充当产品数据

public class Person {
    private String name;
    private int age;
    private List<String> children;
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", children=" + children +
                '}';
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public List<String> getChildren() {
        return children;
    }
    public void setChildren(List<String> children) {
        this.children = children;
    }
}
指挥者,指定具体的建造者用来建造对象

public class Director {
    private AbstractPersonBuilder builder;
    public Director(AbstractPersonBuilder builder) {
        this.builder = builder;
    }
    public void setBuilder(AbstractPersonBuilder builder) {
        this.builder = builder;
    }
    public Person construct() {
        builder.buildName();
        builder.buildAge();
        builder.buildChildren();
        return builder.build();
    }
}
示例

@Slf4j
public class Application {
    public static void main(String[] args) {
        Director director = new Director(new PersonOneBuilder());
        Person person = director.construct();
        log.info("person的信息:{}", person);
        director.setBuilder(new PersonTwoBuilder());
        person = director.construct();
        log.info("person的信息:{}", person);
    }
}

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章