2016-07-02 69 views
1

我正在學習GOF書中的設計模式。可以使用抽象工廠模式類型的協方差

有一件關於抽象工廠模式實現,讓我混在一起。我會用代碼開始:

抽象工廠:

public interface AnimalsFactory { 

    Animal getWaterAnimal(); 

    Animal getLandAnimal(); 

    Animal getFlyingAnimal(); 
} 

混凝土廠:

public class SafariAnimalsFactory implements AnimalsFactory { 

    @Override 
    public Hippo getWaterAnimal() { 
     return new Hippo(); 
    } 

    @Override 
    public Giraffe getLandAnimal() { 
     return new Giraffe(); 
    } 

    @Override 
    public Vulture getFlyingAnimal() { 
     return new Vulture(); 
    } 
} 

我用的類型的協方差這樣的工廠方法返回具體的產品,而不是抽象的產品(動物)。

我喜歡它,但是這不違反有關從客戶端封裝產品的經驗法則嗎?或者,也許我正在推翻這一點。

+0

'獅子getFlyingAnimal()' - 因爲獅子可以飛 –

+0

@SvetlinZarev不知何故,我錯過了xD ... – Tomasz

回答

3

在這種情況下使用協方差很好。這是展示在Java中協變重寫的力量完美的情況下,因爲它可以讓你有兩全其美:

  • 如果你處理廠通過編程的接口,實現是完全由隱藏你
  • 另一方面,如果你直接處理工廠,你可以避免強制轉換。