建造者模式(Bulider模式)

建造者模式(Bulider模式)

模式定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

该模式的主要优点如下:

  1. 各个具体的建造者相互独立,有利于系统的扩展。
  2. 客户端不必知道产品内部组成的细节,便于控制细节风险。

其缺点如下:

  1. 产品的组成部分必须相同,这限制了其使用范围。
  2. 如果产品的内部变化复杂,该模式会增加很多的建造者类。

建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。

模式的结构与实现:

建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成

1. 模式的结构

建造者(Builder)模式的主要角色如下。

  1. 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。
  2. 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
  3. 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
  4. 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

java代码实现v1:

public class BuilderTest {
    public static void main(String[] args) {

//        ProductBuilder defaultConcreteProductBuilder = new DefaultConcreteProductBuilder();
        ProductBuilder specialConcreteProductBuilder = new SpecialConcreteProductBuilder();
        Director director = new Director(specialConcreteProductBuilder);
        Product product = director.makeProduct("bzzb2", "com.noob", "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();

}

//具体创建者1--默认
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 Product(this.productName,this.companyName,this.part1,this.part2,this.part3,this.part4);
    }
}

//具体创建者2
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 Product(this.productName,this.companyName,this.part1,this.part2,this.part3,this.part4);
    }
}

//指挥者
class  Director{

    private ProductBuilder builder;

    public Director(ProductBuilder builder) {
        this.builder = builder;
    }

    public  Product makeProduct(String productName, String companyName, String 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, String 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 + '\'' +
                '}';
    }
}

java代码实现v2:--内部类方式

public class BuilderTest2 {
    public static void main(String[] args) {
        Product build = new Product.Builder().productName("bzzb").companyName("com.itnoob").part1("part1").part2("part2").build();
        System.out.println(build);

    }
}


class Product {


    private final String productName;
    private final  String companyName;
    private final String part1;
    private final String part2;
    private final String part3;
    private final String part4;

    public Product(String productName, String companyName, String part1, String part2, String part3, String part4) {
        this.productName = productName;
        this.companyName = companyName;
        this.part1 = part1;
        this.part2 = part2;
        this.part3 = part3;
        this.part4 = part4;
    }

    //定义一个静态内部类
    static class Builder{

        private String productName;
        private String companyName;
        private String part1;
        private String part2;
        private String part3;
        private String part4;

        public Builder productName(String productName) {
            this.productName = productName;
            return this;
        }
        public Builder companyName(String companyName) {
            this.companyName = companyName;
            return this;
        }
        public Builder part1(String part1) {
            this.part1 = part1;
            return this;
        }
        public Builder part2(String part2) {
            this.part2 = part2;
            return this;
        }
        public Builder part3(String part3) {
            this.part3 = part3;
            return this;
        }
        public Builder part4(String part4) {
            this.part4 = part4;
            return this;
        }


        Product build(){
            Product product = new Product(this.productName, this.companyName, this.part1, this.part2, this.part3, this.part4);
            return product;
        }

    }

    @Override
    public String toString() {
        return "Product{" +
                "productName='" + productName + '\'' +
                ", companyName='" + companyName + '\'' +
                ", part1='" + part1 + '\'' +
                ", part2='" + part2 + '\'' +
                ", part3='" + part3 + '\'' +
                ", part4='" + part4 + '\'' +
                '}';
    }
}
posted @ 2020-07-29 17:44  Noob52037  阅读(174)  评论(0编辑  收藏  举报