设计模式 - 建造者模式(构建者模式)

标准建造者模式

建造者模式:属于创建型设计模式,通俗的说就是,我想要创建一个对象,但是我却不自己去new,而是通过一个"中间商"进行创建,所以我可以不管这个对象在创建过程中的所有的细节。再白一点就是说:我是boss,我就要山寨同行的这个平板,你怎么实现我不管,我就要,然后我就要到了。而你只能在没人看到的角落默默付出,跟你手下的苦力按照图纸拼装一台给我。


废话不多说先分锅


Boss我(boss) 消费者,入口


TeamLeader你(打工仔-动嘴的):产品经理,要统筹资源给这个无赖的boss拼装一台山寨机


IPadPage平板组装图纸 :目标构建流程(接口、抽象类)


Worker你手下的苦力(动手的) :流水工 、实际建造者,根据图纸↑把平板装起来的人


Pad山寨平板:目标产品,要给到老板我的至尊平板。


上码,提速


先让我们看看,我们的目标是什么?!!!!

/**
 * 平板产品
 */
public class Pad {
    /** 屏幕 */
    private String monitor;
    /** 主板 */
    private String motherboard;
    /** 外壳 */
    private String shell;
    /** 固件 */
    private String framework;

    /** 省略了get/set 方法,自行补上 */
    
    @Override
    public String toString() {
        return "Pad{" +
                "monitor='" + monitor + '\'' +
                ", motherboard='" + motherboard + '\'' +
                ", shell='" + shell + '\'' +
                ", framework='" + framework + '\'' +
                '}';
    }
}

通过研究同行产品,我们已经知道了一台平板pad是由几部分组装而成的,那么我们可以得出图纸嘛,let’s go

/**
 * 组装一台平板的图纸
 */
public interface IpadPage {
    /** 装屏幕 */
    void setMonitor();
    /** 装主板 */
    void setMotherboard();
    /** 装外壳 */
    void setShell();
    /** 刷系统 */
    void setFramework();
    /** 得到一台平板 */
    Pad build();
}

好了,这时候,图纸也有了,你让你的手下按照图纸,装一台Pad出来

/**
 * 苦逼的手下
 */
public class Worker implements IpadPage{
    //这是我们的目标,所以要围绕的目标来进行拼装
    Pad pad = new Pad();
    @Override
    public void setMonitor() {
        System.out.println("在废料区找了一下,找到一块还算可用的屏幕");
        this.pad.setMonitor("安装过程 ---> 把屏幕安装上去");
    }

    @Override
    public void setMotherboard() {
        System.out.println("在隔壁公司偷偷的拿了一块主板");
        this.pad.setMotherboard("安装过程 ---> 把主板安装上去");
    }

    @Override
    public void setShell() {
        System.out.println("拿出明天准备送妹子的巧克力,把外盒拆下来,剪出屏幕留空,用来当外壳");
        this.pad.setShell("安装过程 ---> 把外壳装上去");
    }

    @Override
    public void setFramework() {
        System.out.println("上咸鱼,找了个买家,买了个5毛的系统");
        this.pad.setFramework("安装过程 ---> 把系统刷到设备上");
    }

    @Override
    public Pad build() {
        System.out.println("组装山寨平板");
        return this.pad;
    }
}

在这整个过程中你就是负责了资源调控,连接上层boss和管理手下的职责,(收到boss 的 需求,叫手下工作)

/** 这就是你 一个TeamLeader 产品经理*/
public class TeamLeader {

    IpadPage xiaowang = new Worker();
    
    public Pad buildPad(){
        System.out.println("收到boss的要求要拼一台山寨平板");
        System.out.println("叫来了手下小王 进行组装");
        /**
         * 小王按顺序装上了屏幕、主板、外壳,还刷上了系统,最后得到了一个平板上交了任务
         */
        this.xiaowang.setMonitor();
        this.xiaowang.setMotherboard();
        this.xiaowang.setShell();
        this.xiaowang.setFramework();
        return this.xiaowang.build();
    }
}

在这整个事件中,我(大boss)只是说了一句话,你给我搞个平板!

public class Boss {
    public static void main(String[] args) {
        /** 我(大boss) 跟你说,你要给我山寨一台平板,你怎么装,我不管 */
        Pad pad = new TeamLeader().buildPad();
        System.out.println(pad);
    }
}

运行结果

hei.png

这就是标准的建造者模式的流程

变形建造者模式(链式调用)

这种变形的建造者模式,最常见的应该就是在Android代码中new一个Dialog的时候了,废话不多说,上"栗子"


今天发工资了,你闲来无事,去逛二手东,想为自己的老腰谋点福利,毕竟工资还没上交到对象手上,花了也只能认了是吧。所以,在打开京东的第一时间,你就毫不思索地选择搜索"人体工学椅"!通过一番研究,你发现买把椅子也是一件耗费脑力的事情,首先椅子本体一定是需要的是吧,毕竟不可能买空气回来坐。然后你还发现了,椅子都有自己的配件,什么头枕的,衣服架啊,舒躺宝啊什么的,而且都还要额外付费。这时候问题来了,究竟我该怎么配置我的人体工学椅才是最好的呢。


Coder你:一个高端的月入5k的程序员,现在你要在二手东上组装自己的人体工学椅


IChairPage人体工学椅装配组合指南:记录了人体工学椅有哪些配件和本体


Emulator二手东上的购买页面或者模拟装配器:在页面上选择自己需要的配件和本体


Chair人体工学椅:我们的目标就是要打造出适合自己的龙椅


提速,上码!

先让我看看我可能组合到的玩意是怎样的


Chair

/**
 * 目标产品
 */
public class Chair {

    /**
     * 椅子本体
     */
    private String body;
    /**
     * 头枕
     */
    private String head;
    /**
     * 舒躺宝
     */
    private String foot;
    /**
     * 衣服架
     */
    private String hanger;
    /**
     * 颜色
     */
    private String color = "默认黑色";
    /**
     * 私人定制
     */
    private String customMade;

    /** 省略了get/set 方法,自行补上 */

    @Override
    public String toString() {
        return "我自己装配的这把椅子有:[" + "\n" +
                ((this.body != null) ? this.body + ",\n" : "") +
                ((this.head != null) ? this.head + ",\n" : "") +
                ((this.foot != null) ? this.foot + ",\n" : "") +
                ((this.hanger != null) ? this.hanger + ",\n" : "") +
                "颜色是:"+this.color+"\n"+
                ((this.customMade != null) ? "私人定制了:" + this.customMade + ",\n" : "") +
                "]";
    }
}

哇哦,这么多配件可以选,那我是不是可以来玩一玩?


想玩就要通过二手东上的页面选配置或者模拟器模拟装配了,那么二手东上的人体工学椅装配组合指南是怎样的呢?


IChairPage

/** 椅子装配指南 */
public interface IChairPage {
    /** 要椅子本体 */
    public IChairPage buildBody();
    /** 要头枕 */
    public IChairPage buildHead();
    /** 要舒躺宝 */
    public IChairPage buildFoot();
    /** 要衣服架 */
    public IChairPage buildHanger();
    /** 选择颜色 */
    public IChairPage setColor(String color);
    /** 要私人定制 */
    public IChairPage customMade(String msg);
    /** 组装椅子 */
    public Chair build();
}

根据上面的装配组合指南,在二手东上能能用的页面或者模拟器是长什么样的呢?
Emulator

/** 购买页面/装配模拟器 */
public class Emulator implements IChairPage {

    private Chair chair = new Chair();

    @Override
    public IChairPage buildBody() {
        this.chair.setBody("本体");
        return this;
    }

    @Override
    public IChairPage buildHead() {
        this.chair.setHead("头枕");
        return this;
    }

    @Override
    public IChairPage buildFoot() {
        this.chair.setFoot("舒躺宝");
        return this;
    }

    @Override
    public IChairPage buildHanger() {
        this.chair.setHanger("衣服架");
        return this;
    }

    @Override
    public IChairPage setColor(String color) {
        this.chair.setColor(color);
        return this;
    }

    @Override
    public IChairPage customMade(String msg) {
        this.chair.setCustomMade(msg);
        return this;
    }

    @Override
    public Chair build() {
        return this.chair;
    }
}

看着屏幕上的这个模拟器,你开心的试着自己喜欢的组合


Coder

public class Coder {
    public static void main(String[] args) {
        //身为一个专业的码农,怎么可以没头枕?这个私人订制是误选的
        Chair chair = new Emulator()
                .buildBody()
                .buildHead()
                .customMade("靠背上印上麻衣学姐")
                .build();
        System.out.println(chair.toString());
    }
}

运行结果:

iii.png

在变形的写法中,资源的调度角色交由调用者自己选择,所以这里比标准写法要少一个角色。

对于建造者模式的学习记录,纯属个人理解,如果有什么错误的请指正,让我学习一波,互相促进,互相学习!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值