建造者模式
可构建成build模式的条件:
1)参数5个以上
2)存在可选参数
定义:将一个复杂的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
角色:
- 抽象建造者:给出一个抽象接口,定义了各个工人所需要进行的工作。这些工作是为了完成对房子的创建,就像工地会有指导手册一样。
- 具体建造者:具体建造者,具体的建造者(工人)去造房子。房子造完后需要将房子还给房屋主人,所以需要有返回房子的方法
- 设计者(指导者):
1)他知道房子怎么设计
2)他会指挥工人去建造
3)从整体角度出发,他所有举报的功能可以覆盖你的完整需求,哪怕业主提出建一个非常简单的房子,但是他所具备的能力必须全部覆盖 - 产品(房子):房子会有哪些什么属性
使用场景:
- 复杂的对象
- 不同的表示方法
Android源生代码中的使用:AlertDialog
需求:用户需要建房子
流程:用户(建房子)—> 设计者(设计)—> 工人(建造房子)
通过一般方式功能实现代码:
Room.java
package com.test.lib;
/**
* 建造的房子
*/
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;
}
@Override
public String toString() {
return "Room{" +
"window='" + window + '\'' +
", floor='" + floor + '\'' +
'}';
}
}
Builder.java
/**
* 建造者角色
* 工人接口
*/
public interface Builder {
public void makeFloor();
public void makeWindow();
public Room getRoom();
}
Worker.java
package com.test.lib;
/**
* 工人角色
*/
public class Worker implements Builder{
private Room room = new Room();
@Override
public void makeFloor() {
room.setFloor("Europe floor");
}
@Override
public void makeWindow() {
room.setWindow("French Window");
}
@Override
public Room getRoom() {
return room;
}
}
Client.java
package com.test.lib;
/**
* 客户
*/
public class Client {
public static void main(String[] args) {
Worker worker = new Worker();
Designer designer = new Designer();
designer.design(worker);
System.out.println(worker.getRoom());
}
}
输出结果:
> Task :lib:Client.main()
Room{window='French Window', floor='Europe floor'}
通过建造者模式实现代码:
Worker.java
package com.test.builderMode;
public class Worker {
private RoomParams params;
public Worker() {
this.params = new RoomParams();
}
public Worker makeWindow(String window) {
params.window = window;
return this;
}
public Worker makeFloor(String floor) {
params.floor = floor;
return this;
}
public Room build() {
Room room = new Room();
room.apply(params);
return room;
}
class RoomParams {
public String window;
public String floor;
}
}
Room.java
package com.test.builderMode;
public class Room {
private String window;
private String floor;
public void apply(Worker.RoomParams params) {
this.window = params.window;
this.floor = params.floor;
}
@Override
public String toString() {
return "Room{" +
"window='" + window + '\'' +
", floor='" + floor + '\'' +
'}';
}
}
Client.java
package com.test.builderMode;
public class Client {
public static void main(String[] args) {
Room room = (new Worker()).makeFloor("Europe floor")
.makeWindow("French Windows")
.build();
System.out.println(room.toString());
}
}
编译结果:
> Task :lib:Client.main()
Room{window='French Windows', floor='Europe floor'}