建造者模式

先说下建造者模式各个角色类比。

建造者模式
1.有一个对外的统一管理者 Manger 类比:包工头 对客户来说的唯一对接人,所以代码中 只和它对接
2.抽象建造者 AbstractBuilder ,施工队,该施工队可以完成大厦各个部分的组成,如水泥,木工,钢筋工等工种 去完成对应的活。
3.具体建造者 具备完成某种建造能力的Builder 具体的某一施工队。里面 有各种建筑工人种类。
4.最终构建完成的产品Product 大厦完成所需要的组成部分。各组成部分由对应施工队完成

现在已大厦作为类比:
完成大厦需要的零部件 假如有俩种:木头,水泥。

调用流程: 包工头接到一个工程。
然后包工头去找了 一个施工队。施工队中有各种工种,各种工人。
去完成对应的大厦组成部件,
然后将部件组装起来。
大厦完成。

1.设计思路
先定义大厦需要的组成部分
把活派给包工头
包工头找来施工队
施工队完成大厦组成
交付

优点:
代码灵活,可读性 高可以很灵活的完成复杂产品的整体的某个组成的快速迭代

缺点
产品过于复杂的话,可能就导致定义很多的具体建造类。

和抽象工厂的比较 建造者模式专注于某一个产品的完整创建。
抽象工厂是完成一系列产品的生产过程。


在实战中 我们一般都是出于包工头的角色。

代码实战:

// 要完成的某一复杂产品
public
class DaSha { private String mutou; private String shuini; private String gangjin; public String getMutou() { return mutou; } public void setMutou(String mutou) { this.mutou = mutou; } public String getShuini() { return shuini; } public void setShuini(String shuini) { this.shuini = shuini; } public String getGangjin() { return gangjin; } public void setGangjin(String gangjin) { this.gangjin = gangjin; } @Override public String toString() { return "我完成建造了"+mutou+shuini+gangjin; } }
/**
 *  抽象建造者,完成整个大厦完成 需要的的建筑能力  施工队需要具备的能力
 *  里面有各种 完成复杂产品的建造者具备的能力
/**
 * 某一施工队完成 具体的施工队
 */
public class BuilderA extends AbsractBuilder {
    @Override
    public void buildmutou() {
        daSha.setMutou("BuilderA 施工队 完成木工");
    }

    @Override
    public void buildshuini() {
        daSha.setShuini("BuilderA 施工队 完成水泥工");
    }

    @Override
    public void buildgangjin() {
        daSha.setGangjin("BuilderA 施工队 完成钢筋工");
    }
}

/**
 * 包工头统一对外接口 包工头验收交付
 */
public class Baogongtou {

    private AbsractBuilder builder;

    public Baogongtou(AbsractBuilder builders) {
        this.builder = builders;
    }

    /**
     * 包工头完成最后交付工作
     *
     * @return
     */
    public DaSha getResult() {
        builder.buildmutou();
        builder.buildshuini();
        builder.buildgangjin();
        return builder.getResult();
    }

}

  

*/
public abstract  class AbsractBuilder {

    //创建的产品对象
    protected DaSha daSha=new DaSha();
    //木工
    public abstract void buildmutou();
    //水泥
    public abstract void buildshuini();
    //钢筋
    public abstract void buildgangjin();

    public DaSha getResult(){
        return daSha;
    }
}
/**
 * 建造者模式测试
 */
public class BuildTest {

    public static void main(String[] args) {
        Baogongtou baogongtou=new Baogongtou(new BuilderA());
        System.out.println(baogongtou.getResult().toString());
    }

}

 

posted @ 2020-04-17 10:55  liuxw666  阅读(183)  评论(0编辑  收藏  举报