java - 如果我们使用工厂模式,我们是否应该向用户隐藏产品?

标签 java c# design-patterns factory-pattern

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

我的问题是,是否有规则或良好实践建议我们隐藏 Dog、Cat 和 Fish 以免直接使用?我的意思是 Dog myDog = new Dog(); 将在代码中被禁止。

如果有,我们如何正确隐藏它们?

最佳答案

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

也就是说,如果 Animal.Speak() 没问题,那么只需公开动物并将实现细节留给消费者未知即可。但是,如果有特定于 Dog 的东西,例如 Dog.BarkAtMoon(),那么您必须深入了解它的使用方式。

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

也许你会有

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

关于java - 如果我们使用工厂模式,我们是否应该向用户隐藏产品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33374167/

相关文章:

java - 致命异常 : AsyncTask #1:java. lang.RuntimeException:执行 doInBackground() 时发生错误

java - 当用户输入数据/删除文本时,在 TextField 中显示/消失默认文本

c# - 软件即服务的最佳应用程序设计

java - 如何避免重复的 if 语句

design-patterns - 实现命令模式

JavaScript 设计模式 : how to create sub-module and access parent module private vars and functions

java - 为什么文件在同一个包中却需要导入?

java - 特定包的完全限定类名?

c# - 已安装 .NET 语言包,但拼写检查仅适用于英语

c# - WPF 中 TextBox 的 BorderThickness(错误?)