博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
北风设计模式课程---7、建造者模式
阅读量:6269 次
发布时间:2019-06-22

本文共 3885 字,大约阅读时间需要 12 分钟。

北风设计模式课程---7、建造者模式

一、总结

一句话总结:

设计模式都是对生活中好的做事方法的一些抽象,使得各司其职,减少出错。
建造者模式可以看做模仿的生活中:设计师,施工队做复杂房子交给客户的场景
角色:学设计模式分清角色就很简单了

 

1、建造者模式是什么?

1、造房子:隐藏复合对象的创建过程
2、不同施工队:把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建
3、用户:用户单纯的从施工队那里接收房子即可

用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

 

2、建造者模式实例?

1、房子基类:比如修房子,有房子基类,如果直接让用户修房子的话,修不同的房子修改麻烦
2、施工队:找工程队(接口)来修,如果修平房就找修平房的建造工人(接口实例),如果修楼房就找修楼房的建造工人(接口实例),这些具体的工人要返回实例出去的,修房子的过程就是修改房子基类属性的过程
3、设计师:有设计师角色,设计师角色指导工程队来修房子,设计师里面有工程队的实例,方便指挥工程队做事

 

3、建造者模式的修房子实例的核心代码示例?

1、找具体工程队:HouseBuilder builder = new GongyuBuilder(); //比如这里修公寓 //由工程队来修
2、设计师指导工程队做:HouseDirector director = new HouseDirector(); director.makeHouse(builder);
3、第二步中可以弄成静态方法来优化一下

 

4、建造者模式应用场景是什么?

1、创建对象的时候:Builder模式是为对象的创建而设计的模式
2、创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象
3、关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法

 

5、建造者模式的实质是什么?

施工队:做房子由专门的施工队来做
设计师:施工队怎么做由设计师来指导
用户:直接接收施工队做好的house即可

 

6、建造者模式的优缺点是什么?

1、方便用户:用户不必关注复杂房子的创建过程,直接从施工队手里拿房子即可
2、不同施工队各司其职:建造不同的房子,或者建造房子中不同的部位,有不同的施工队

 

7、legend2项目中如何使用建造者模式(比如构建奖励的数据)?

施工队:比如构建奖励的数据,不同的施工队构建不同类型的奖励,比如装备、特性书等
设计师:有一个设计师,来负责指导施工队该怎么做
用户:用户只管得到施工队处理好的数据即可

 

 

 

 

二、内容在总结中

1、相关知识

 

 

2、代码

房子基类:House.java

施工队接口:HouseBuilder.java

平房施工队(实现施工队接口):PingFangBuilder.java:做平房

公寓施工队(实现施工队接口):GongyuBuilder.java:做公寓

设计师:HouseDirector.java:指导具体施工队如何做房子

用户-主类: MainClass.java:获取具体施工队做好的房子

 

 

房子基类:House.java

1 /* 2  * ·¿×Ó 3  */ 4 public class House { 5     // µØ°å 6     private String floor; 7     // ǽ 8     private String wall; 9     // Îݶ¥10     private String housetop;11 12     public String getFloor() {13         return floor;14     }15 16     public void setFloor(String floor) {17         this.floor = floor;18     }19 20     public String getWall() {21         return wall;22     }23 24     public void setWall(String wall) {25         this.wall = wall;26     }27 28     public String getHousetop() {29         return housetop;30     }31 32     public void setHousetop(String housetop) {33         this.housetop = housetop;34     }35 36 }

 

 

施工队接口:HouseBuilder.java

/* * ¹¤³Ì¶Ó */public interface HouseBuilder {    //ÐÞµØ°å    public void makeFloor();    //ÐÞǽ    public void makeWall();    //ÐÞÎݶ¥    public void makeHousetop();    public House getHouse();}

 

 

平房施工队(实现施工队接口):PingFangBuilder.java:做平房

/* * 平房工程队 */public class PingFangBuilder implements HouseBuilder {    House house = new House();        public void makeFloor() {        house.setFloor("平房-->地板");    }    public void makeHousetop() {        house.setHousetop("平房-->房顶");    }    public void makeWall() {        house.setWall("平房-->墙");    }    public House getHouse() {        return house;    }}

 

 

公寓施工队(实现施工队接口):GongyuBuilder.java:做公寓

public class GongyuBuilder implements HouseBuilder{    House house = new House();        public House getHouse() {        return house;    }    public void makeFloor() {        house.setFloor("公寓-->地板");    }    public void makeHousetop() {        house.setHousetop("公寓-->房顶");    }    public void makeWall() {        house.setWall("公寓-->墙");    }    }

 

 

设计师:HouseDirector.java:指导具体施工队如何做房子

public class HouseDirector {            public void makeHouse(HouseBuilder builder) {        builder.makeFloor();        builder.makeWall();        builder.makeHousetop();    }    }

 

 

用户-主类: MainClass.java:获取具体施工队做好的房子
public class MainClass {    public static void main(String[] args) {//        //客户直接造房子//        House house = new House();//        house.setFloor("地板");//        house.setWall("墙");//        house.setHousetop("屋顶");                        //由工程队来修        HouseBuilder builder = new GongyuBuilder();        //设计者来做        HouseDirector director = new HouseDirector();        director.makeHouse(builder);                House house = builder.getHouse();        System.out.println(house.getFloor());        System.out.println(house.getWall());        System.out.println(house.getHousetop());    }}

 

 
 
 

转载于:https://www.cnblogs.com/Renyi-Fan/p/10993594.html

你可能感兴趣的文章
BootStrap 专题
查看>>
linux 下同步异步,堵塞非堵塞的一些想法
查看>>
原子变量的性能问题
查看>>
HDU4638:Group(线段树离线处理)
查看>>
Jenkins构建触发器
查看>>
COCOS学习笔记--即时动作ActionInstant
查看>>
The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
查看>>
最全面的JS表单验证
查看>>
VS2013 查看程序各个函数的CPU利用率<转>
查看>>
python-标识符(Identifiers)和关键字(keywords)
查看>>
iframe双滚动栏 解决方案 CSS3 overflow-y 属性
查看>>
rsync数据同步工具
查看>>
文件上传限制文件类型
查看>>
基于Android平台的会议室管理系统具体设计说明书
查看>>
Linux常见命令(四)——mkdir
查看>>
正则表达式基础知识
查看>>
Web下的HTTPS应用
查看>>
perl数组的长度与元素个数
查看>>
Netty线程模型
查看>>
『Kaggle』Sklearn中几种分类器的调用&词袋建立
查看>>