设计模式5——建造者模式

设计模式5——建造者模式

第一种方式(建造者模式):

package com.ghl.builder.demo01;

/**
 * @ProjectName DesignPattern
 * @ClassName Builder
 * @Date 2020/8/26 17:11
 * @Author gaohengli
 * @Version 1.0
 */
//建造者模式
    //抽象的建造者:方法
public abstract class Builder {

    abstract void buildA();//地基
    abstract void buildB();//钢筋工程
    abstract void buildC();//铺电线
    abstract void buildD();//粉刷

    //完工,得到产品
    abstract Product getProduct();

}

package com.ghl.builder.demo01;

/**
 * @ProjectName DesignPattern
 * @ClassName Product
 * @Date 2020/8/26 17:16
 * @Author gaohengli
 * @Version 1.0
 */
//产品:房子
public class Product {

    private String buildA;
    private String buildB;
    private String buildC;
    private String buildD;

    public String getBuildA() {
        return buildA;
    }

    public void setBuildA(String buildA) {
        this.buildA = buildA;
    }

    public String getBuildB() {
        return buildB;
    }

    public void setBuildB(String buildB) {
        this.buildB = buildB;
    }

    public String getBuildC() {
        return buildC;
    }

    public void setBuildC(String buildC) {
        this.buildC = buildC;
    }

    public String getBuildD() {
        return buildD;
    }

    public void setBuildD(String buildD) {
        this.buildD = buildD;
    }

    @Override
    public String toString() {
        return "Product{" +
                "buildA='" + buildA + '\'' +
                ", buildB='" + buildB + '\'' +
                ", buildC='" + buildC + '\'' +
                ", buildD='" + buildD + '\'' +
                '}';
    }
}

package com.ghl.builder.demo01;

/**
 * @ProjectName DesignPattern
 * @ClassName Worker
 * @Date 2020/8/26 21:20
 * @Author gaohengli
 * @Version 1.0
 */
//具体的建造者:工人
public class Worker extends Builder {

    Product product;

    public Worker() {
        product=new Product();
    }

    @Override
    void buildA() {
        product.setBuildA("地基");
        System.out.println("地基");
    }

    @Override
    void buildB() {
        product.setBuildB("钢筋工程");
        System.out.println("钢筋工程");
    }

    @Override
    void buildC() {
        product.setBuildC("铺电线");
        System.out.println("铺电线");
    }

    @Override
    void buildD() {
        product.setBuildD("粉刷");
        System.out.println("粉刷");
    }

    @Override
    Product getProduct() {
        return product;
    }
}

package com.ghl.builder.demo01;

/**
 * @ProjectName DesignPattern
 * @ClassName Director
 * @Date 2020/8/26 21:27
 * @Author gaohengli
 * @Version 1.0
 */
//指挥:核心。负责指挥构建一个工程,工程如何构建,有它决定
public class Director {

    //指挥工人按照顺序建房子
    public Product build(Builder builder){
        builder.buildA();
        builder.buildB();
        builder.buildC();
        builder.buildD();

        return builder.getProduct();
    }
}

package com.ghl.builder.demo01;

/**
 * @ProjectName DesignPattern
 * @ClassName Test
 * @Date 2020/8/26 21:32
 * @Author gaohengli
 * @Version 1.0
 */
//测试建造者模式
public class Test {
    public static void main(String[] args) {
        //指挥
        Director director = new Director();
        //指挥具体的工人完成产品
        Product build = director.build(new Worker());
        System.out.println(build.toString());
    }
}

第二种方式:

package com.ghl.builder.demo02;

/**
 * @ProjectName DesignPattern
 * @ClassName Builder
 * @Date 2020/8/26 21:46
 * @Author gaohengli
 * @Version 1.0
 */
//抽象的建造者
public abstract class Builder {

    abstract Builder buildA(String msg);//汉堡
    abstract Builder buildB(String msg);//可乐
    abstract Builder buildC(String msg);//薯条
    abstract Builder buildD(String msg);//甜点

    abstract Product getProduct();//拿到产品

}

package com.ghl.builder.demo02;

/**
 * @ProjectName DesignPattern
 * @ClassName Product
 * @Date 2020/8/26 21:47
 * @Author gaohengli
 * @Version 1.0
 */
//产品
public class Product {

    private String buildA = "汉堡";
    private String buildB = "可乐";
    private String buildC = "薯条";
    private String buildD = "甜点";

    public String getBuildA() {
        return buildA;
    }

    public void setBuildA(String buildA) {
        this.buildA = buildA;
    }

    public String getBuildB() {
        return buildB;
    }

    public void setBuildB(String buildB) {
        this.buildB = buildB;
    }

    public String getBuildC() {
        return buildC;
    }

    public void setBuildC(String buildC) {
        this.buildC = buildC;
    }

    public String getBuildD() {
        return buildD;
    }

    public void setBuildD(String buildD) {
        this.buildD = buildD;
    }

    @Override
    public String toString() {
        return "Product{" +
                "buildA='" + buildA + '\'' +
                ", buildB='" + buildB + '\'' +
                ", buildC='" + buildC + '\'' +
                ", buildD='" + buildD + '\'' +
                '}';
    }
}

package com.ghl.builder.demo02;

/**
 * @ProjectName DesignPattern
 * @ClassName Worker
 * @Date 2020/8/26 21:53
 * @Author gaohengli
 * @Version 1.0
 */
//具体的建造者
public class Worker extends Builder{

    private Product product;

    public Worker() {
        product=new Product();
    }

    @Override
    Builder buildA(String msg) {
        product.setBuildA(msg);
        return this;
    }

    @Override
    Builder buildB(String msg) {
        product.setBuildB(msg);
        return this;
    }

    @Override
    Builder buildC(String msg) {
        product.setBuildC(msg);
        return this;
    }

    @Override
    Builder buildD(String msg) {
        product.setBuildD(msg);
        return this;
    }

    @Override
    Product getProduct() {
        return product;
    }
}

package com.ghl.builder.demo02;

/**
 * @ProjectName DesignPattern
 * @ClassName Test
 * @Date 2020/8/26 21:56
 * @Author gaohengli
 * @Version 1.0
 */
//测试构造者模式
public class Test {
    public static void main(String[] args) {
        //服务员
        Worker worker = new Worker();
        Product product = worker.getProduct();
        System.out.println(product.toString());

        //链式编程,在原来的基础上自由组合
        Product product1 = worker.buildA("全家桶").
                getProduct();
        System.out.println(product1.toString());

    }
}