2)建造者模式(Builder)
2017-02-08 本文已影响0人
浅尘Lian
一、通过Client、Director、Builder和Product形成的建造者模式
例子
就好象我要一座房子住,可是我不知道怎么盖,也不知道怎么样设计,于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要!
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;
}
}
Builder:
class RoomBuilder {
private Room room = new Room();
public void makeWindow() {
room.setWindow(new Window());
}
public void makeFloor() {
room.setFloor(new Floor());
}
public Room getRoom() {
return room;
}
}
Director:
class Designer {
public void command(Builder builder){
// 先建造地板
builder.makeFloor();
// 再建造窗户
builder.makeWindow();
}
}
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();
}
}
二、通过静态内部类等方式实现的零件无序话构造:
package com.qqyumidi;
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;
}
}
}
</br>
使用此种方式可以直接通过联级形式构造对象非常直观方便。Android中的AlertDialog即采用此种方式创建。
</br>