4.Builder——建造者模式

demo描述:盖房子,根据需要可以盖普通房子,也可以盖高楼,无论盖什么样的房子,它们的流程类似。

 

demo代码:

抽象建造者,产品蓝图、规定建造产品的必要步骤,托管产品的实例化:

public abstract class HouseBuilder {

    protected House house = new House();

    //建造的必要步骤
    public abstract void buildBasic();
    public abstract void buildWalls();
    public abstract void roofed();

    public House buildHouse(){
        return house;
    }

}

具体建造者,实现蓝图,根据需求的差异给出不同的实现:

public class CommonHouse extends HouseBuilder{

    @Override
    public void buildBasic() {
        System.out.println("普通房子打地基5米");
    }

    @Override
    public void buildWalls() {
        System.out.println("普通房子砌墙10米");
    }

    @Override
    public void roofed() {
        System.out.println("普通房子的小屋顶");
    }

}


public class HighBuilding extends HouseBuilder {

    @Override
    public void buildBasic() {
        System.out.println("高楼打地基100米");
    }

    @Override
    public void buildWalls() {
        System.out.println("高楼砌墙20米");
    }

    @Override
    public void roofed() {
        System.out.println("高楼的华丽屋顶");
    }
    
}

产品,建造者的建造对象:

@Data
public class House {
    private String baise;
    private String wall;
    private String roofed;
}

指挥者,指挥建造者建造出产品:

public class HouseDirector {

    HouseBuilder houseBuilder = null;

    // 构造器传入 HouseBuilder
    public HouseDirector(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    // 建造房子的流程交给指挥者
    public House constructHouse(){
        houseBuilder.buildBasic();
        houseBuilder.buildWalls();
        houseBuilder.roofed();
        return houseBuilder.buildHouse();
    }

}

客户端:

public class Client {
    public static void main(String[] args) {
        CommonHouse commonHouse = new CommonHouse();
        HouseDirector houseDirector = new HouseDirector(commonHouse);
        House house = houseDirector.constructHouse();
    }
}

demo类图:

类图分析:由图可以看出建造者模式将同一类的不同实现做了一个抽象,抽象出来房子(2位置)这一产品,将产品的实例化过程描述、实例化交给了抽象建造者,将产品类不同的实现做成了具体的建造者,由具体建造者完成产品具体的描述(实现方式、顺序)。到这儿产品有了、建造者也有了,谁来将这两个类联系起来完成最终产品的生产——指挥者,指挥者组织建造的各个步骤,然后再调用抽象建造者中实例化产品的方法创建出产品。如果要增加新的产品,只要产品的构建流程类似,在1处增加新的产品描述就行。

(产品的描述可以看成是产品的属性的set方法,将产品的set与实例化分离,具体建造者给产品不同的set值,从而使客户端get到属性相同属性值不同的产品)

 

适用场景:产品有较多的共同点、组成部分相似;注意,当产品内部变化复杂的时候会导致要有很多建造者来实现这些变化,使系统庞大,所以用此模式时要考虑好产品的后期变化。

 

总结:工厂系列方法将产品实例化与使用相分离,关注点在如何将复杂的、多样的对象创建出来供使用者使用;建造者模式更加关注产品建造流程的抽象,将相似的流程提取出来,以不同的实现方式实现这些流程从而产生不同的产品;相比之下,工厂里没有规则、流程这一概念,也正因此,可生产的产品可具有两重维度,而建造者更像是一个具有生产规则的工厂,可以通过规则的不同落实方式生产不同的产品,流程规范化的代价就是产品的维度降低了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值