2011-08-09 16 views
6

我看到這很多,我想知道是否有一種方法來重構這很好,以避免大規模切換?這是工廠中的一個方法:RoomControllerFactory,根據其類型實例化一個遊戲位置。下面是從工廠方法開關的例子:是否有替代工廠方法切換?

  switch (location.getType()) 
      { 
       case Location.ROOMONE: 
        return new RoomOneController(location, data, view);   

       case Location.ROOMTWO: 
        return new RoomTwoController(location, data, view); 

       case Location.ROOMTHREE: 
        return new RoomThreeController(location, data, view); 
+0

我不知道動作,但我會使用散列表來註冊不同位置的類型與RoomControllerFactory inturn可以實例化右房間控制器。 soooo在C#中最初 roomControllerFactories [location.getType()] = new RoomOneControllerFactory();後面跟着:roomControllerFactories [location.getType()] .create(location,data,view); – Polity

+1

這些RoomController實例是否在程序中多次實例化?例如,如果它是一個迷宮,你會有多個TeeIntersectionRoomController實例嗎?或者這些實例在遊戲中是絕對獨一無二的,例如BuckinghamPalaceThroneRoomController?這可能會影響最佳解決方案... – jpwrunyan

+0

它們存在於同一時間,即當您前往該位置時,但目前不止一次實例化,也就是說,如果您返回roomone,我們將重新創建房間1.但也有一些房間是獨一無二的,一些房間足夠抽象,可以用來代表多個房間,例如一個房間類型的商店可以用於許多不同的位置,只是通過銷售數據的東西,但房間類型自己的房間只會使用一次。我希望這一點很清楚。 :) – serenskye

回答

3

簡而言之,工廠切換,這就是他們所做的 - 這種風格的工廠的全部重點是將構建邏輯集中到一個地方,而不是圍繞代碼庫散佈。

只要你沒有使用靜態工廠和編寫一個IRoomControllerFactory接口,那麼你就可以獲得所有通常的OOP好處:在運行時將它交換出來/用於測試 - 畢竟你說'Yo RoomControllerFactory,給我這個神奇的標識符的房間!'

作爲你的問題的進一步答案,你可能想問問自己,爲什麼你需要這麼多具體的RoomController實例?也許通過贊成構造而不是繼承,你可以重構事物來使用Builder而不是?

4

看到,因爲你使用的是黑客提供枚舉功能 - 你爲什麼不添加一個方法到您的枚舉:

public static const ROOMONE : LocationType = new LocationType("locationone", 
    function(...) : RoomController { 
     return new RoomOneController 
    } 
); 

(原諒任何愚蠢的錯誤 - 動作是不是我的第一語言!)

在java中,我會做類似:

public enum LocationType { 
    ROOMONE { 
     @Override 
     public RoomController getRoomController() { 
      return new RoomOneController(); 
     } 
    }; 
    public abstract RoomController getRoomController(); 
} 
+0

是的,這當然看起來像一個更清潔的解決方案,它減少了添加位置到一個地方的變化,工廠不需要知道它的創建:) – serenskye

+0

糾正我,如果我錯了,但這消除了原來的「工廠「完全對吧?由於工廠只是檢查一個枚舉值並吐出一個類實例,對吧?我覺得我失去了一些東西...... – jpwrunyan

+1

在這種情況下 - 是的。但從更廣泛的意義上說,可能需要進一步實施返回的具體對象,這可能需要保留工廠。 – Martyn