建造者模式

94 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

本文系作者 不太自律的程序猿原创,转载请私信并在文章开头附带作者和原文地址链接。

建造者模式

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

使用场景

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

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

3.与不可变对象配合使用

角色

在这样的设计模式中,有以下几个角色:

1 builder:为创建一个产品对象的各个部件指定抽象接口。

2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。

3 Director:构造一个使用Builder接口的对象。

4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

代码演示


public class BuilderTest {

    public static void main(String[] args) {

        Product product=new Product( );

        product.setCompanyName( "xxx" );

        product.setPart1( "xxx" );


        ProductBuilder specialConcreteProductBuilder=new SpecialConcreteProductB uilder();

        Director director=new Director(specialConcreteProductBuilder);

        Product product=director.makeProduct( "productNamexxx""cn...""part1", "part2", "part3", "part4" );

        System.out.println(product);
    }

}


interface ProductBuilder{

    void builderProductName(String productName);

    void builderCompanyName(String companyName);

    void builderPart1(String part1);

    void builderPart2(String part2);

    void builderPart3(String part3);

    void builderPart4(String part4);



    Product build();

    }
}


class DefaultConcreteProductBuilder implements ProductBuilder{

    private String productName;

    private String companyName;

    private String part1;

    private String part2;

    private String part3;

    private String part4;

    @Override

    public void builderProductName(String productName) {

        this.productName=productName;

    }



    @Override

    public void builderCompanyName(String companyName) {

        this.companyName=companyName;

    }



    @Override

    public void builderPart1(String part1) {

        this.part1=part1;

    }



    @Override

    public void builderPart2(String part2) {

        this.part2=part2;

    }



    @Override

    public void builderPart3(String part3) {

        this.part3=part3;

    }



    @Override

    public void builderPart4(String part4) {

        this.part4=part4;

    }



    @Override

    public Product build() {

        return new Productthis.productName,this.companyName,this.part1,this.pa rt2,this.part3,this.part4 );

    }

}



class SpecialConcreteProductBuilder implements ProductBuilder{


    private String productName;

    private String companyName;

    private String part1;

    private String part2;

    private String part3;

    private String part4;

    @Override

    public void builderProductName(String productName) {

        this.productName=productName;

    }



    @Override

    public void builderCompanyName(String companyName) {

        this.companyName=companyName;

    }



    @Override

    public void builderPart1(String part1) {

        this.part1=part1;

    }



    @Override

    public void builderPart2(String part2) {

    this.part2=part2;

    }



    @Override

    public void builderPart3(String part3) {

        this.part3=part3;

    }



    @Override

    public void builderPart4(String part4) {

        this.part4=part4;

    }



    @Override

    public Product build() {

        return new Productthis.productName,this.companyName,this.part1,this.p art2,this.part3,this.part4 );

    }


}

class Director{



private ProductBuilder builder;



public Director(ProductBuilder builder) {

this.builder=builder;

}



public Product makeProduct(String productName, String companyName, Stri ng part1, String part2, String part3, String part4){


    builder.builderProductName(productName );

    builder.builderCompanyName(companyName );

    builder.builderPart1(part1 );



    builder.builderPart2(part2 );

    builder.builderPart3(part3 );

    builder.builderPart4(part4 );


    Product product=builder.build();

        return product;

    }

}



class Product {


    private String productName;

    private String companyName;

    private String part1;

    private String part2;

    private String part3;

    private String part4;





    public Product() {

    }
    
    public Product(String productName, String companyName, String part1, St

    ring part2, String part3, String part4) {

        this.productName=productName;

        this.companyName=companyName;

        this.part1=part1;

        this.part2=part2;

        this.part3=part3;

        this.part4=part4;

    }



    public String getProductName() {

        return productName;

    }



    public void setProductName(String productName) {

        this.productName=productName;

    }



    public String getCompanyName() {

        return companyName;

    }



    public void setCompanyName(String companyName) {

        this.companyName=companyName;

    }



    public String getPart1() {

        return part1;

    }



    public void setPart1(String part1) {

    this.part1=part1;

    }



    public String getPart2() {

        return part2;

    }



    public void setPart2(String part2) {

        this.part2=part2;

    }

    public String getPart3() {

        return part3;

    }



    public void setPart3(String part3) {

        this.part3=part3;

    }



    public String getPart4() {

        return part4;

    }



    public void setPart4(String part4) {

        this.part4=part4;

    }



    @Override

    public String toString() {

        return "Product{" +

        "productName='" + productName + '\'' +

        ", companyName='" + companyName + '\'' +

        ", part1='" + part1 + '\'' +

        ", part2='" + part2 + '\'' +

        ", part3='" + part3 + '\'' +

        ", part4='" + part4 + '\'' +

        '}';

    }

}

优缺点

优点:

封装性好,客户端不必知道内部产品的实现细节。 建造者独立,容易扩展。 便于控制细节风险。

缺点:

建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

JDK源码中的应用:

1 org.springframework.web.servlet.mvc.method.RequestMappingInfo

2 org.springframework.beans.factory.support.BeanDefinitionBuilder

感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞👍关注。