标准建造者模式
建造者模式:属于创建型设计模式,通俗的说就是,我想要创建一个对象,但是我却不自己去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);
}
}
运行结果
这就是标准的建造者模式的流程
变形建造者模式(链式调用)
这种变形的建造者模式,最常见的应该就是在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());
}
}
运行结果:
在变形的写法中,资源的调度角色交由调用者自己选择,所以这里比标准写法要少一个角色。
对于建造者模式的学习记录,纯属个人理解,如果有什么错误的请指正,让我学习一波,互相促进,互相学习!!!