工厂模式+建造者模式(用例说明)(二)

// 接上一篇

建造者模式

基于上一篇的图继续~
在这里插入图片描述
思路就是:

  1. 消费者自己new出一个房子显然不现实,所以消费者请了worker帮忙造房子(house上加了一层worker)
  2. 消费者管理worker的实现步骤显然太麻烦,所以消费者请了director帮忙看着worker(worker上加了一层director)
  3. 这样消费者只用挑选合适的director和worker,house就创建出来了
    下面看代码:
    先写好写的House和BuilderMap
public class House {
    // 房子由四部分组成 
    private Roof roof; // 屋顶由工厂模式提供,其余暂时用字符串代替
    private String wall;
    private String ground;
    private String outside;

    public Roof getRoof() { return roof; }
    public String getWall() { return wall; }
    public String getGround() { return ground; }
    public String getOutside() { return outside; }
    @Override
    public String toString() {
        String msg = "建造出来的房子外观是: \n" +
                "屋顶:"+roof.getMaterial() + "\n"
                + "墙壁:"+ wall + "\n"
                + "地板:"+ ground + "\n"
                + "外围有:"+ outside;
        return msg;
    }
}
public interface BuilderMap {
    // 造房子的四步
    void step4Roof();
    void step4Wall();
    void step4Ground();
    void step4Outside();
    // 交付产品
    House getHouse();
}

接下来看工人类,工人类是对图纸的具体实现
工人1和工人2对于图纸的实现不一样。
工人1是女生,她用木头造屋顶,她喜欢粉色所以墙被砌成粉色,周围种很多绿化;工人2是男生,他用铁造屋顶,喜欢把墙涂成黄色,周围建停车场能赚钱

public class Worker1 implements BuilderMap {
    private House house;
    
    public Worker1() {
		house = new House(); // 由工人1负责创建产品
    }
    @Override
    public void step4Roof() {
        Roof roof = new WoodenRoofFactory().getRoof();
        house.setRoof(roof);
    }
    @Override
    public void step4Wall() { house.setWall("粉色"); }
    @Override
    public void step4Ground() { house.setGround("粉色"); }
    @Override
    public void step4Outside() { house.setOutside("绿化带"); }
    @Override
    public House getHouse() { return house; }
}

public class Worker2 implements BuilderMap {
    private House house;

    public Worker2() {
        house = new House(); // 由工人2负责创建产品
    }
    @Override
    public void step4Roof() {
        Roof roof = new IronRoofFactory().getRoof();
        house.setRoof(roof);
    }
    @Override
    public void step4Wall() { house.setWall("黄色"); }
    @Override
    public void step4Ground() { house.setGround("黄色"); }
    @Override
    public void step4Outside() { house.setOutside("停车场"); }
    @Override
    public House getHouse() { return house; }
}

接下来就是包工头登场了
包工头根据图纸指挥工人按步骤干活
包工头1是个普通人,决定先打地基再砌墙;包工头2不是一般人,他决定先砌墙再打地基

public class Director1 { 
    public House build(BuilderMap builderMap) {
        builderMap.step4Ground();
        builderMap.step4Wall();
        builderMap.step4Roof();
        builderMap.step4Outside();
        return builderMap.getHouse();
    }
}

public class Director2 { 
    public House build(BuilderMap builderMap) {
        builderMap.step4Wall();
        builderMap.step4Ground();
        builderMap.step4Roof();
        builderMap.step4Outside();
        return builderMap.getHouse();
    }
}

最后是消费者端:

public class Client {
    public static void main(String[] args) {
        Director1 director1 = new Director1();
        // 包工头1 指挥 工人1 完成房子1建造
        House house1 = director1.build(new Worker1());
        System.out.println(house1.toString());

        Director2 director2 = new Director2();
        // 包工头2 指挥 工人2 完成房子2建造
        House house2 = director2.build(new Worker2());
        System.out.println(house2.toString());
    }
}

打印结果如下:
在这里插入图片描述

总结

与工厂模式相比,建造者模式返回的是一个完整的产品,而工厂模式返回的是一系列相关的或大或小的产品。
在造房子的例子中,我使用了工厂模式造屋顶,使用建造者模式造房子。
设计模式更多体现的是在不同的场景下的应对思路的差异,至于实现大多是向上再封装一层

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值