概念
建造者模式是将复杂事物的构建与它的表示进行分离,使得同样的构建过程可以创建不同的表示形式。
- 通过Client、Director、Builder和Product创建建造者模式
其中Builder负责Product的构建过程,Director负责指导Builder,要求Builder负责按照其的构建方式进行构建,最后Builder返回结果给到Client。
网上对此用了一个很形象的比喻:
(转)简单地说,就好象我要一座房子住,可是我不知道怎么盖(简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高),于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要,记住了!
1、房子(Product)
class Room {
private Window window;
private Floor floor;
public Window getWindow() {
return window;
}
public void setWindow(Window window) {
this.window = window;
}
public Floor getFloor() {
return floor;
}
public void setFloor(Floor floor) {
this.floor = floor;
}
}
2、工人接口(Builder)
interface Builder {
public void makeWindow();
public void makeFloor();
public Room getRoom();
}
3、工人(Builder,具体实现类)
class RoomBuilder implements Builder {
private Room room = new Room();
@Override
public void makeWindow() {
room.setWindow(new Window());
}
@Override
public void makeFloor() {
room.setFloor(new Floor());
}
@Override
public Room getRoom() {
return room;
}
}
4、房子设计师(Director)
class Designer {
public void command(Builder builder){
// 先建造地板
builder.makeFloor();
// 再建造窗户
builder.makeWindow();
}
}
5、房主(Client,请设计师和工人造房子)
public class Client {
public static void main(String[] args) {
// 先找来一个工人
Builder builder = new RoomBuilder();
// 再找来一个房屋设计师
Designer designer = new Designer();
// 工人按照设计师设计建造
designer.command(builder);
// 工人向雇主交房子
Room newRoom = builder.getRoom();
}
}
- 通过静态内部类实现零件无序化的构造
常见代码如下
public class Client {
public static void main(String[] args) {
User.Builder builder = new User.Builder();
User user = builder.setName("corn").setAge(100).setAddress("广州").build();
}
}
class User {
private String name;
private int age;
private String address;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getAddress() {
return address;
}
public static class Builder {
private User user = new User();
public Builder setName(String name) {
user.name = name;
return this;
}
public Builder setAge(int age) {
user.age = age;
return this;
}
public Builder setAddress(String address) {
user.address = address;
return this;
}
public User build() {
return user;
}
}
}
使用此种方式可以直接通过联级形式构造对象非常直观方便。Android中的AlertDialog即采用此种方式创建。
总结
建造者模式优缺点
优点:
良好的封装性, 使用建造者模式你不必知道内部的细节,只要知道我想要什么效果就行了。
缺点:
1、更多的代码,需要Builder这样的内部类
2、增加了类创建的运行时开销