一、定義
GOF上對生成器模式的意圖如此描述:將一個複雜對象的構建與他的表示分離,使得同樣的構建過程可以創建不同的表示。
具體來說,生成器模式將一個複雜對象的構造邏輯從其代碼中分離出來。這種做法在有些情況是很有用的,例如當一個類的規模很
大,我們可能希望減少其規模;又如,構造器方法的參數只能逐步獲取,我們希望一步一步地構造目標對象,如對象屬性需要從XML文
件中解析出來,我們希望解析出所有必須的屬性後才進行對象的構造,若某項屬性缺失則表示構造的是無效對象,這時我們就可以使用
生成器模式。
二、場景設計
有時候一個複雜對象的組件可能有多套,如構造迷宮的例子中,迷宮中可能有帶有炸彈的組件BombedXXX,有帶有咒語的組件EnchantXXX。爲了讓構造一個迷宮的算法可以獨立於其組成部分的構造以及裝配方式,生成器模式就可以排上用場。
三、類圖
參與者:
Builder——爲創建一個Product對象的各個部件指定抽象接口。
ConcreteBuilder——實現Builder的接口以構造和裝配該產品的各個部件;提供一個檢索產品的的方法(GetResult)
Director——構造一個使用Builder接口的對象
Product——表示被構造的複雜對象。包含定義組成部件的類,包含將這些部件裝配成最終產品的接口。
四、代碼示例
Maze.java 這個類在我代碼裏是空的,只是爲了體現框架
public class Maze {
}
MazeBuilder.java 生成器超類
public abstract class MazeBuilder {
public void buildMaze()
{
}
public void buildRoom(int num)
{
}
public void buildDoor(int roomFrom,int roomTo)
{
}
public Maze getMaze()
{
return null;
}
}
CountingMazeBuilder.java 具體生成器類,只是這裏的功能是統計組件個數
public class CountingMazeBuilder extends MazeBuilder {
private int doors;
private int rooms;
public CountingMazeBuilder()
{
this.doors=0;
this.rooms=0;
}
@Override
public void buildRoom(int num) {
this.rooms++;
}
@Override
public void buildDoor(int roomFrom, int roomTo) {
this.doors++;
}
public void getCount()
{
System.out.println("Rooms: "+this.rooms+" Doors: "+this.doors);
}
}
MazeGame.java Director類,createMaze方法利用Builder對象來構造迷宮
public class MazeGame {
public Maze createMaze(MazeBuilder builder)
{
builder.buildMaze();
builder.buildRoom(1);
builder.buildRoom(2);
builder.buildDoor(1, 2);
return builder.getMaze();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MazeGame game=new MazeGame();
CountingMazeBuilder builder=new CountingMazeBuilder();
game.createMaze(builder);
builder.getCount();
}
}