builder模式是 builder負(fù)責(zé)產(chǎn)生組件, 然后使用director進(jìn)行組裝。
實(shí)現(xiàn)復(fù)雜對(duì)象的構(gòu)建 與 它的表示進(jìn)行分離。
比如迷宮的例子。
目的 是獲取一個(gè)迷宮。
迷宮的組件是 room 和 wall (并且有的wall上面需要有door)
需要的原料
public class Maze { //迷宮
//interface 只能是 static final的成員變量 子類繼承使用的時(shí)候無法改變父類的成員變量
// Maze 包含room的集合。
// private Room room;
private Map<String, Room> roomList = new HashMap<>();// 房間號(hào)和對(duì)應(yīng)的Room
Room roomNo(int n){
return null;
}
public void addRoom(String no, Room room){
roomList.put(no, room);
}
public Room getRoom(String no){
return roomList.get(no);
}
Maze cloneMaze(){
return null;
}
public static final List<Room> mRoomList = new ArrayList<>();
@Override
public String toString() {
return "Maze{" +
"roomList=" + roomList.get("001").getSide("East") +
'}';
}
}
public interface DoorOrWall {
public boolean enter();//是否可以通過
}
public class Door implements DoorOrWall{
@Override
public boolean enter() {
return true;
}
}
public class Wall implements DoorOrWall{
//不可通過的墻壁
@Override
public boolean enter(){
return false;
}
}
然后 builder負(fù)責(zé)創(chuàng)建 room(添加wall) 和door(添加door)
public interface MazeBuilder <T>{
public T buildRoom(String room);
public T buildDoor(String roomFrom, String roomTo);
public Maze getMaze();
}
public class CountingMazeBuilder implements MazeBuilder<CountingMazeBuilder>{
Maze maze = null;
Room room = new Room();
int _rooms;
int _doors;
String[] direction = {"East", "West", "South", "North"};
public CountingMazeBuilder(){
_rooms = _doors = 0;
}
@Override
public CountingMazeBuilder buildRoom(String roomNum) {
room.setSide(direction[3], new Wall());
maze.addRoom(roomNum, room);
return this;
}
@Override
public CountingMazeBuilder buildDoor(String roomFrom, String roomTo) {
Room room1 = maze.getRoom(roomFrom);
Room room2 = maze.getRoom(roomTo);
Door door = new Door();
if(room1 != null){
System.out.println("room1 not null");
}
if(room1 == null){
System.out.println("room1 null");
}
room1.setSide("East", door);
return this;
}
@Override
public Maze getMaze() {
return maze;
}
//CountingMazeBuilder 自己的3個(gè)方法 而上面的是繼承Builder的方法。
public CountingMazeBuilder buildMaze(){
//實(shí)例化 maze
this.maze = new Maze();
return this;
}
void addWall(int x, String[] direction){
}
void getCounts(int x, int y){}
}
director 導(dǎo)向或者組裝器
public class Director {
private CountingMazeBuilder builder;
public Director(CountingMazeBuilder builder){
this.builder = builder;
}
public void construct(){
builder.buildMaze()
.buildRoom("001") //
.buildDoor("001", "002");
}
}
測(cè)試
public class MazeDriver {
public static void main(String[] args) {
CountingMazeBuilder builder = new CountingMazeBuilder();
Director director = new Director(builder);
director.construct();//給上面的builder 賦值(先實(shí)例化Maze,然后添加room)
Maze maze = builder.getMaze();
System.out.println(maze);
}
}
Director中一直持有 builder 在執(zhí)行construct方法(給builder中字段Maze添加room) 進(jìn)入Builder中 set值, 然后builder中字段Maze.addRoom() 然后就可以getMaze()獲取迷宮了
結(jié)果
