您当前的位置: 首页 > 

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

设计模式是什么鬼(建造者)

小志的博客 发布时间:2019-06-04 17:22:59 ,浏览量:0

转载自:https://mp.weixin.qq.com/s/127lzD8b1qVQ7lVDYHmd0w

建造者,用于对复杂对象的构造、初始化,与工厂模式不同的是,建造者的目的在于把复杂构造过程从不同对象展现中抽离出来,使得同样的构造工序可以展现出不同的产品对象。

打个比方,我们知道角色扮演类游戏中玩家可以选择不同的职业,各职业攻击力、防御力等等属性设定是不同的,比如战士的力量和体力强,法师的灵力强而体力弱,以及穿戴各种装备引起的属性附加。 在这里插入图片描述 假设我们用同一个类来描述这些角色,那么应该怎样新建人物并配备初始武器?交给客户端去完成,把法师配成战士的力量并给脑袋上装备一把屠龙刀吗?诚然,客户端根本不知道怎样去配置(更没有必要知道),游戏人设应该交给专业的团队(建造者模式)去完成,否则会造成不可预知的混乱角色,如同怪物一般的bug存在。 在这里插入图片描述好了,让我们来规划一下专业的建造团队。既然是建造者,那就应该造点建造物了,我们就以盖房子举例。 在这里插入图片描述房子本身有很多个组成部分,各组件息息相关缺一不可,否则房倒屋塌。而其构造过程也是相当复杂的,但大家不必担心,为响应我们简约直观的一贯宗旨,这里只将其简化拆分成地基、墙体、屋顶三部分,首先来看建筑物类。

public class Building {// 建筑物

    // 用来模拟房子组件的堆叠
    private List buildingComponents = new ArrayList();

    public void setBasement(String basement) {// 地基
        this.buildingComponents.add(basement);
    }

    public void setWall(String wall) {// 墙体
        this.buildingComponents.add(wall);
    }

    public void setRoof(String roof) {// 房顶
        this.buildingComponents.add(roof);
    }

    @Override
    public String toString() {
        String buildingStr = "";
        for (int i = buildingComponents.size() - 1; i >= 0; i--) {
            buildingStr += buildingComponents.get(i);
        }
        return buildingStr;
    }

}

为了模拟建筑物通用类中各组件的建造顺序,我们在第4行以List来模拟三个组件的堆叠,之后是它们对应的三个建造方法,最后于第19行的toString方法自下而上的打印出最终完成的房子。看起来是不难,但怎样从这个类直接构造出一个房子呢?怎样去设置这些字符串的组件属性呢?此时客户端一头雾水,还是找个专业施工方吧,先定义个施工方接口。

public interface Builder {//施工方接口

    public void buildBasement();

    public void buildWall();

    public void buildRoof();

    public Building getBuilding();

}

既然是施工方的接口,那一定有实现类了,先来写一个高端别墅施工队。

public class HouseBuilder implements Builder {//别墅施工方

    private Building house;

    public HouseBuilder() {
        house = new Building();
    }

    @Override
    public void buildBasement() {
        System.out.println("挖地基,部署管道、线缆,水泥加固,搭建围墙、花园。");
        house.setBasement("╬╬╬╬╬╬╬╬\n");
    }

    @Override
    public void buildWall() {
        System.out.println("搭建木质框架,石膏板封墙并粉饰内外墙。");
        house.setWall("|田|田 田|\n");
    }

    @Override
    public void buildRoof() {
        System.out.println("建造木质屋顶、阁楼,安装烟囱,做好防水。");
        house.setRoof("╱◥███◣\n");
    }

    @Override
    public Building getBuilding() {
        return house;
    }

}

嗯,这个施工方看起来是有施工资质的,不管是地基、墙体还是屋顶都讲得(第11行等)头头是道,虽然我们不懂,但建造工艺(第12行等)看起来也都是非常有考究,总之是极其专业的施工方并统统实现了每个组件的建造方法,下来我们同样地再请一个公寓楼的施工队。

public class ApartmentBuilder implements Builder {// 高层公寓楼施工方

    private Building apartment;

    public ApartmentBuilder() {
        apartment = new Building();
    }

    @Override
    public void buildBasement() {
        System.out.println("深挖地基,修建地下车库,部署管道、线缆、风道。");
        apartment.setBasement("╚═════════╝\n");
    }

    @Override
    public void buildWall() {
        System.out.println("搭建多层建筑框架,建造电梯井,钢筋混凝土浇灌。");
        for (int i = 0; i             
关注
打赏
1661269038
查看更多评论
0.0413s