如果我们使用Factory Pattern我们应该隐藏用户的产品吗?

时间:2015-10-27 17:04:09

标签: java c# design-patterns factory-pattern

假设我有一个AnimalFactory类,可以生成Dog, CatFish。 使用AnimalFactory使事情变得非常简单,一切都很好。

我的问题是,是否有规则或良好做法表明我们隐藏狗,猫和鱼直接使用?我的意思是代码中禁止Dog myDog = new Dog();

如果有,我们怎样才能正确隐藏它们?

5 个答案:

答案 0 :(得分:1)

除了指出界面方面的其他答案之外,如果需要以某种方式构造复杂对象,并且您希望在一个地方强制执行该要求,工厂模式也很有用。在这种情况下,根据您的问题,最好还要保护构建该对象的任何其他方法。

答案 1 :(得分:0)

是的,如果您的对象只能通过工厂创建,您应该尽量避免有人跳过此规则。

在c#中,如果Dog,Cat和Fish的消费者使用不同的组件,您可以将构造器设置为内部,这种方式只有工厂,这与您的" animals"可以创造它们。

我确定在java中有类似的东西。

答案 2 :(得分:0)

这完全取决于消费者是否需要关心狗或猫,或者他们是否可以只使用一些动物?

也就是说,如果Animal.Speak()没问题,那么只需暴露动物并将实现细节留给消费者不知道。但是,如果有狗特定的东西,比如Dog.BarkAtMoon(),那么你必须深入了解它是如何使用的。

此外,您可能希望依赖接口,例如IAnimal。然后你有类Dog:IAnimal,你的工厂返回IAnimals。通过这种方式,消费者知道甚至更少关于实现,并且只有接口。

也许你会有

class AnimalFactory
{
  IAnimal GetAnimal(AnimalTypeEnum type) { ... return IAnimal type requested ... }
  Dog GetDog(string name) { ... just give me a dog named "name" (or IDog) ... }
}

答案 3 :(得分:0)

回答你的问题,是的。请允许我详细说明 -

当我们直接实例化Dog myDog = new Dog();之类的对象时,我们会编写一个依赖项。

现在假设,您希望为实例化Dog的函数编写单元测试用例,您将无法用模拟Dog对象替换实际的dog对象。因此,我们坚持接口和从外部提供依赖。

如果我想强制使用Interface&阻止使用new运算符,我可以进行以下设置 -

  1. 接口汇编 - 这将定义public interface IDog

  2. 具体实施的大会 - 这是internal class Dog& public class Factory函数将返回Create

  3. IDog
  4. 装配客户端 - 此处Dog将无法访问,因此客户端创建狗实例的唯一方法是通过工厂返回IDog 这样的事情IDog dog = factory.Create();

  5. 我保持设置非常简单只是为了传达我的观点

答案 4 :(得分:0)

依赖性倒置原则告诉我们客户端类应该避免依赖于具体的实现。工厂模式通过屏蔽客户端与创建逻辑来促进这一点,客户端将使用接口而不是某些具体类。使具体类的构造函数包本地而不是公共可能是一个好方法。