2012-11-07 70 views
1

我已經創建了一個具有不同實現的BicycleProducer接口:OffroadBicycleProducer,FastBicycleProducer等等。在屬性/上下文類中封裝屬性

這些工廠都需要很多參數來生產自行車。我想將這些屬性封裝在一個類中,並將它傳遞給produce方法。然而,自行車需要不同的屬性 - 有些可能是相同的 - 我想知道如何正確地做到這一點。在BicycleProducer的接口中,我目前有一個名爲produce的方法,它採用參數BicycleProducingContext,它是一個具有所有常用屬性的接口。然後你有實現它的實現,並根據它是什麼類型的自行車來添加必要的屬性。然後你需要將它轉換爲produce方法......但我不知道。這似乎有點狡猾(可能不會),我覺得。

這是一個很好的方法,或者我應該以另一種方式做到這一點?

public interface BicycleProducer { 
    void produce(BicycleProducingContext context); 
} 

public class OffroadBicycleProducer implements BicycleProducer { 

    public void produce(BicycleProducingContext context) { 
     context = (OffroadBicycleProducingContext) context; 
    } 
} 

public interface BicycleProducingContext { 

    int numberOfBicycles(); 
    void brand(String brand); 
} 

public class OffroadBycycleProducingContext implements BicycleProducingContext { 

    //.. 
} 
+1

顯示真實的代碼,比段落更容易閱讀 –

+0

好的,添加了一些示例代碼(修剪版本)。 – LuckyLuke

+0

看起來像雙派遣...也許你應該調整*訪問者*以適應你的情況。 –

回答

1

我發現兩件事情有點尷尬你提出的設計:

  1. 對我來說,它看起來像你可能不需要工廠(即你的Producer類)。當您需要構建在編譯時不知道其類型的對象時,工廠很有用。但是,由於您正在考慮爲每種類型的自行車分別開設工廠班級(例如OffroadBicycleProducer),所以我假設您知道您想提前構建什麼樣的對象。

  2. 使用上下文類來使參數傳遞不那麼醜陋是一個好主意,但是如果您開始爲每種類型的自行車創建單獨的上下文類,那麼最終會遇到必須知道構建上下文的尷尬情況以及它需要的數據 - 如果你有這些,你可以跳過中間步驟並立即構建Bicycle

如果我是正確的假設,你知道你需要什麼樣的對象,構建時間提前,然後而是採用工廠,我會去要麼與建築商模式,或者用普通的老構造。該構造方法看起來可能像下面這樣:

public abstract class Bicycle { 
    private int year; 
    private String color; 

    public Bicycle(BicycleProducingContext context) { 
     this.year = context.getYear(); 
     this.color = context.getColor(); 
    } 
} 

public class OffroadBicycle extends Bicycle { 
    private String terrainType; 

    public OffroadBicycle(BicycleProducingContext context) { 
     super(context); 
     this.terrainType = context.getTerrainType(); 
    } 
} 

public class FastBicycle extends Bicycle { 
    private int maxSpeed; 

    public FastBicycle(BicycleProducingContext context) { 
     super(context); 
     this.maxSpeed = context.getMaxSpeed(); 
    } 
} 

如果你不知道你想構建到運行時是什麼類型的Bicycle,那麼你可以用上面的方法有一個工廠。例如:

public class BicycleFactory { 
    public static Bicycle constructBicycle(BicycleProducingContext context) { 
     if (context.getBicycleType().equals("OffroadBicycle")) { 
      return new OffroadBicycle(context); 
     } else if (context.getBicycleType().equals("FastBicycle")) { 
      return new FastBicycle(context); 
     } else { 
      throw new IllegalArgumentException("Encountered unrecognized Bicycle type: " + context.getBicycleType()); 
     } 
    } 
} 

我希望我不是過度簡化你的使用情況,但在我看來,像上面應該做到你在找什麼。

+0

但是這是一個EJB服務,它在Service層。 – LuckyLuke

+0

我不確定我明白爲什麼服務層會阻止您以這種方式構建「自行車」。你能詳細說明嗎? –