建造者模式
来源:互联网 发布:云之家软件 编辑:程序博客网 时间:2024/05/29 10:01
学习笔记
建造者模式:
概念基本来自:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/19/2599980.html
建造者模式的本质和建造楼房是一致的:即流程不变,但每个流程实现的具体细节则是经常变化的。建造者模式的好处就是保证了流程不会变化,流程即不会增加、也不会遗漏或者产生流程次序错误,这是非常重要的。将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式通常包括下面几个角色:
1. builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
3. Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
4. Product:要创建的复杂对象。
建造者模式的结构图:
具体实现:
Build.java(抽象建造者) WorkBuild.java(具体建造者) Designer.java(设计者) Room.java(产品)
Build.java
package com.dongnao.build;/** * 建造者角色 * 工人接口,定义了各个工人所需要进行的工作 * 并不负责具体的建造 * * 同时房子是具体的(工人)建造的 所以需要有返回房子的方法 * @author tucheng * */public interface Build {public void makeWindow();public void makeFloor();public Room getRoom();}
WorkBuilder.java
package com.dongnao.build;public class WorkBuilder implements Build{private Room room=new Room();@Overridepublic void makeWindow() {room.setFloor("地板 ");}@Overridepublic void makeFloor() {room.setWindow("窗户");}@Overridepublic Room getRoom() {return room;}}
Designer.java
package com.dongnao.build;/** * 指导者 角色 * 所具备的能力 * * 设计师 他知道房子怎么设计 * 他会指挥工人去建造 * 实际生活中 大厦的设计者并不会看大厦的具体实现细节 * 更多的是从整体角度出发,指挥这个工人团队建造 * 所以他肯定对工人所具备的能力和行为有很深的了解 * 换做程序代码中 ,他也肯定会持有工人 的这个对象的引用 * * * @author tucheng * */public class Designer {public void order(Build build){build.makeFloor();build.makeWindow();}}
Room.java
package com.dongnao.build;/** * 房子类 * 首先要描述下 房子要有些什么 * 有哪些属性 * * @author tucheng * */public class Room {private String window;private String floor;public String getWindow() {return window;}public void setWindow(String window) {this.window = window;}public String getFloor() {return floor;}public void setFloor(String floor) {this.floor = floor;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "---->floor "+floor+" window "+window;}}
外部调用:
Client.java
package com.dongnao.build;public class Client { public static void main(String[] args) { Build worker = new WorkBuilder(); //获取工人对象 Designer designer = new Designer(); //获取设计师对象 designer.order(worker); //设计师指挥工人工作 System.out.println(worker.getRoom());; //工人交房 } }
上面是标准的建造者模式,不过在实际开发中,使用标准建造者模式的都不多,一般都是使用其变形
WorkBuilder.java Room.java
无抽象建造者,无设计者
WorkBuilder.java
package com.dongnao.build.noddesigner;public class WorkBuilder{private RoomParmas parmas;public WorkBuilder( ) {this.parmas = new RoomParmas();}public WorkBuilder makeWindow(String window ) {parmas.window=window;return this;}public WorkBuilder makeFloor(String floorCorlor) {parmas.floor=floorCorlor;return this;}public WorkBuilder makeDoor(String door) {parmas.door=door;return this;}public Room makeChat(String chat) {parmas.chat=chat;Room room=new Room();return room;}public void show(){}public Room build() {Room room=new Room();room.apply(parmas);return room;}class RoomParmas{public String window;public String floor;public String door;public String chat;}}
package com.dongnao.build.noddesigner;/** * 房子类 * 首先要描述下 房子要有些什么 * 有哪些属性 * * @author tucheng * */public class Room {private String window;private String floor;private String doorl;private String chat;public void apply(WorkBuilder.RoomParmas parmas){window=parmas.window;floor=parmas.floor;doorl=parmas.door;chat=parmas.chat;}public void setChat(String chat) {this.chat = chat;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "---->floor "+floor+" window "+window;}public void show(){}}
Client.java
package com.dongnao.build.noddesigner;public class Client { public static void main(String[] args) { Room room=(new WorkBuilder()).makeWindow("蓝色玻璃").makeFloor("黄色地板").makeChat("中式厨房");//获取工人对象 System.out.println(room);; //工人交房 } }
Room中的所有属性都私有化,在WorkBuilder中存在一个内部类(Room所有属性的备份),要对Room属性进行赋值其实是通过给WorkBuilder中内部类的属性赋值来间接完成的。
0 0
- Builder 建造者模式
- 建造者模式
- 设计模式-------建造者
- 建造者模式
- 建造者模式(Builder)
- 建造者模式(Builder)
- 建造者模式
- 建造者模式 - builder
- 建造者模式
- Builder建造者模式
- 建造者模式(Builder)
- 建造者模式(builder)
- 建造者模式
- java建造者模式
- 建造者模式
- 建造者模式
- 建造者模式(Builder)
- 建造者模式
- node爬虫进阶之——登录
- mac brew 的安装
- Visible Lattice Points(POJ3090)
- SplitContainer.SplitterDistance属性值设置
- React
- 建造者模式
- swift 属性定义 存储属性、计算属性、类属性
- Adobe 全家桶系列卸载工具
- 算法设计与应用基础作业(一)
- 【Java】JDK的环境变量配置
- 逻辑地址、虚拟地址、线性地址、物理地址
- 使用安卓自带刷新控件实现ListView的上拉加载和下拉刷新
- 【Oracle学习】之 表空间
- javaWEB总结(24):相对路径和绝对路径