假设我有一个AnimalFactory
类,可以生成Dog, Cat
和Fish
。
使用AnimalFactory
使事情变得非常简单,一切都很好。
我的问题是,是否有规则或良好做法表明我们隐藏狗,猫和鱼直接使用?我的意思是代码中禁止Dog myDog = new Dog();
。
如果有,我们怎样才能正确隐藏它们?
答案 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
运算符,我可以进行以下设置 -
接口汇编 - 这将定义public interface IDog
具体实施的大会 - 这是internal class Dog
& public class Factory
函数将返回Create
IDog
装配客户端 - 此处Dog
将无法访问,因此客户端创建狗实例的唯一方法是通过工厂返回IDog
这样的事情IDog dog = factory.Create();
我保持设置非常简单只是为了传达我的观点
答案 4 :(得分:0)
依赖性倒置原则告诉我们客户端类应该避免依赖于具体的实现。工厂模式通过屏蔽客户端与创建逻辑来促进这一点,客户端将使用接口而不是某些具体类。使具体类的构造函数包本地而不是公共可能是一个好方法。