2016-07-02 41 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中协变重写的力量完美的情况下,因为它可以让你有两全其美:

  • 如果你处理厂通过编程的接口,实现是完全由隐藏你
  • 另一方面,如果你直接处理工厂,你可以避免强制转换。