1. 程式人生 > >建造者模式 Builder

建造者模式 Builder

現在假設你想修一棟房子,房子的架構用二維資料來表示,如:0代表空間,1代表牆壁,2代表樓道。而你又想可以自己隨意更換房子的材料,如一樓是磚牆做材料,二樓是石頭做材料。

此時你可以找一個指揮者,他負責來讀你的架構,再找兩名能分別做磚牆和石頭的建築師來進行建造。現在只要指揮者按照你設計的架構去指揮不同建築師來建造不同的模組,就能看到你所想要的房子。

/**
 * @author Jerval
 * @date 2011-4-25
 */
public interface IBuilder {

	public void createSpace();
	public void createWall();
	public void createPillar();
	public void nextFloor();
}

/**
 * @author Jerval
 * @date 2011-4-25
 */
public class StoneBuilder implements IBuilder {

	@Override
	public void createSpace() {
		System.out.print("[]");
	}

	@Override
	public void createWall() {
		System.out.print("█");
	}

	@Override
	public void createPillar() {
		System.out.print("T");
	}

	@Override
	public void nextFloor() {
		System.out.println();
	}

}

/**
 * @author Jerval
 * @date 2011-4-25
 */
public class BrickBuilder implements IBuilder {

	@Override
	public void createSpace() {
		System.out.print(" ");
	}

	@Override
	public void createWall() {
		System.out.print("|");
	}

	@Override
	public void createPillar() {
		System.out.print("I");
	}

	@Override
	public void nextFloor() {
		System.out.println();
	}

}


/**
 * @author Jerval
 * @date 2011-4-25
 */
public class Commander {

	private IBuilder builder;
	private int[][] design;

	public void setBuilder(IBuilder builder) {
		this.builder = builder;
	}

	public void setDesign(int[][] design) {
		this.design = design;
	}

	public void build() {
		for (int i = 0; i < design.length; i++) {
			for (int j = 0; j < design[i].length; j++) {
				switch (design[i][j]) {
				case 0:
					builder.createSpace();
					break;
				case 1:
					builder.createWall();
					break;
				case 2:
					builder.createPillar();
					break;
				default:
					System.out.println("the value:" + design[i][j]
							+ " is undefined!");
					break;
				}
			}
			builder.nextFloor();
		}
	}
}

/**
 * @author Jerval
 * @date 2011-4-25
 */
public class MainClass {

	public static void main(String[] args) {
		int design[][] = { { 1, 1, 1, 1, 1, 1, 1 }, { 1, 0, 0, 0, 0, 2, 1 },
				{ 1, 0, 1, 0, 1, 0, 1 }, { 1, 0, 2, 1, 0, 1, 1 },
				{ 1, 1, 0, 1, 0, 1, 1 }, { 1, 0, 0, 2, 0, 0, 1 },
				{ 1, 1, 1, 1, 1, 1, 1 } };
		Commander commander = new Commander();
		commander.setDesign(design);
		commander.setBuilder(new StoneBuilder());
		commander.build();
		System.out.println("=========================");
		commander.setBuilder(new BrickBuilder());
		commander.build();
	}
}