2012-09-20 56 views
5

我不知道我是否可以實現Builder設計模式,但沒有從中派生出具體的構建器的接口/抽象類?我可以只有一個建造者嗎?生成器設計模式 - 沒有抽象類/接口

如果我只是一個混凝土建築師和導演,它仍然是建築師的設計模式?

更具體:

我有一些對象,我想「放在一起」,以一個複雜的對象。作爲更精確我有以下類別:

門 牆 房

我想建立一個「世界」這些CLASSE的,那就是所有這些類合併給了我的世界。

感謝

回答

2

你可以建造者模式與visitor pattern結合:通過某種數據樹的建設者,每個實現一個accept(Visitor v)方法,並有製造商在樹路過的每個節點回訪客通過接受方法。

+0

嗨。我只允許使用構建器模式。 – mrjasmin

2

如果我只是一個混凝土建築師和導演,它仍然是建築師的設計模式?

我不會在一開始就掛上這個問題。如果您的項目只需要構建一種「世界」類型,並且您確實不需要多個構建器子類,那麼使用導演和單個具體構建器是一種有效的方法。而是把注意力集中在模式的精神上 - 即把你的導演與世界應該如何建立的細節隔離開來。

一旦您的代碼正常工作,並且您對結果滿意,請返回並查看導演和構建者的真實互動方式。然後考慮重構構建者提取一個通用界面,以確定導演和構建者之間的合同。

我發現從一個工作的具體類中提取出一個合理的接口,然後嘗試猜測這個接口可能是什麼,並嘗試在同一時間開發接口和類,會容易得多。

3

是的,你絕對可以擁有一個簡單的WorldBuilder,他的工作是創建一個由門,牆和房間組成的完全配置的世界。當你不想有部分構建的,可能是無效的世界對象暴露時,這是非常有用的。

比方說,建築商的用法是這樣的:

WorldBuilder builder = new WorldBuilder(); 

// read the definition of a room from an XML file or other source. 
// this is vastily simplified, you'd probably be iteration 
// something like this: 
// 
// for each Room in file 
//  for each wall in room 
//   for each door in wall 
// 
roomId = readRoomId(); 
wallId = readWallId(); 
doorId = readDoorId(); 
destRoomId = readDestinationRoomId(); 

builder.AddRoom(roomId); 
builder.AddWallToRoom(roomId, wallId, SIDE.NORTH); 
builder.AddDoorToWall(wallId, DOORSTYLE.WOODEN | DOORSTYLE.LOCKED, destRoomId); 

// etc, etc 

World world = builder.makeWorld(); 

非製造商的做法可能想要做這樣的事情來連接兩個房間對象:

Door door = new Door(roomOne, roomTwo); 

但是,如果你像以前一樣從一個文件迭代每個房間,那麼你將不會有第二個房間的參考,因爲它可能還沒有到達。

的另一種方法是給每一個對象及其鄰居或父母只是ID等你拿這個,它可讓您指的是尚未加載的對象:

Door door = new Door(roomOneId, roomTwoId); 

但如果在文件中出現錯誤,而房間2從未被定義,那麼世界將是無效的。

構建者可以關注正確構建,連接和驗證世界創建過程的所有細節,爲希望創建世界的客戶端代碼賦予靈活性,並且還可以釋放複雜構建邏輯的世界對象。

+0

謝謝。這是我考慮的問題。我想我不需要導演? – mrjasmin

+0

我會說我發佈的示例代碼迭代XML文件將是導演。您可以輕鬆地讓另一位導演從數據庫中提取數據。無論是哪種情況,製作人都可以保持不變,從而讓導演和製作人之間保持清晰的分離。 – tcarvin