1.5、设计模式 [创建型]- 建造者模式(Builder Pattern)

原创
2022/06/07 19:53
阅读数 124

建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

介绍

意图: 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:

主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用: 一些基本部件不会变,而其组合经常变化的时候。

优点:

1、建造者独立,易扩展。

2、便于控制细节风险。

缺点:

1、产品必须有共同点,范围有限制。

2、如内部变化复杂,会有很多的建造类。

使用场景:

1、需要生成的对象具有复杂的内部结构。

2、需要生成的对象内部属性本身相互依赖。

注意事项: 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

结构与实现

角色 在建造者模式中,有如下4个角色

1、产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。

2、抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。

3、具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。

4、指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

产品类

public class Product {
    private String partA;
    private String partB;
    private String partC;
    public void setPartA(String partA) {
        this.partA = partA;
    }
    public void setPartB(String partB) {
        this.partB = partB;
    }
    public void setPartC(String partC) {
        this.partC = partC;
    }
}

抽象建造者

public abstract class Builder {
    public abstract void buildPartA();
    public abstract void buildPartB();
    public abstract void buildPartC();
    public abstract Product buildProduct();
}

具体建造者1

public class ConcreteBuilder1 extends Builder {
    private Product product=new Product();
    public void buildPartA() {
        product.setPartA("建造 PartA");
    }
    public void buildPartB() {
        product.setPartB("建造 PartB");
    }
    public void buildPartC() {
        product.setPartC("建造 PartC");
    }
    public Product buildProduct(){
        return product;
    }
}

具体建造者2

public class ConcreteBuilder1 extends Builder {
    private Product product=new Product();
    public void buildPartA() {
        product.setPartA("建造 PartA");
    }
    public void buildPartB() {
        product.setPartB("建造 PartB");
    }
    public void buildPartC() {
        product.setPartC("建造 PartC");
    }
    public Product buildProduct(){
        return product;
    }
}

指挥者

public class Director {
    private Builder builder;
    public Director(Builder builder) {
        this.builder = builder;
    }
    //产品构建与组装方法
    public Product construct() {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
        return builder.buildProduct();
    }
}

客户端
public class Client {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        Product product = director.construct();
    }
}

注意 可以看出建造者模式和Lombook注解实现的builder还是有一定的区别的;两者的初衷有所差别,但是最终目的都是让开发者更好的去创建自己的对象!另外,在我们日常开发中,构造各个部分零件没有顺序关系时,可能有时候为了简便,并没有使用指挥者,而是直接用建造者来构造。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部