【问题标题】:Factory method, why we use a static call to get the object from factory工厂方法,为什么我们使用静态调用从工厂获取对象
【发布时间】:2013-08-30 03:41:27
【问题描述】:

据我所知,在使用工厂方法时,我们通过调用工厂的静态方法来获取对象 .. 像 Foo f = Factory.getObj() .. 该方法是静态的,因为我们之前不需要创建对象调用getObj 方法实际上将返回我想要的具体对象。但是为什么使用new Factory() 创建Factory 类的实例然后调用req getObj 方法并不常见呢? 对不起,如果这听起来很愚蠢,但为什么将工厂方法设为静态是很常见的?

静态工厂和工厂也是两个不同的东西吗?

【问题讨论】:

  • 工厂方法确保类中只引用一个实例。在这种情况下,我认为构造函数是私有的,因此不允许直接创建一个对象。它需要通过 getObj 或 getInstance 等公共静态方法创建
  • 同意,工厂的构造函数应该是私有的,只是为了保证工厂的实例只存在一个?
  • 检查那些:Static vs non-staticConstructor vs factory,它们应该可以帮助您理解。还有这个one too

标签: java design-patterns factory-pattern static-factory


【解决方案1】:

您应该阅读Effective Java Item 1: Consider static factory methods instead of constructors。那里有详细的解释。此外,经典的工厂方法设计模式http://en.wikipedia.org/wiki/Factory_method_pattern 不是静态的。所以它可以双向使用。

【讨论】:

  • 所以静态工厂和经典工厂方法是两个不同的东西?
  • 是的,Effective Java 指出:请注意,静态工厂方法与设计模式中的工厂方法模式不同
  • 使用静态工厂或其他方法时我应该记住什么天气
  • 视情况而定。 Integer.valueOf 使用静态,没有人怀疑它是一个好主意。但另一方面,使用静态方法不是 OOP,不能为静态方法定义接口,不能传递工厂子类等
  • 所以我发现使用静态工厂有一个很大的优势,即我可以返回任何子类型的对象,这在普通的构造函数调用中是不可能的。这就是你想要指出的。
【解决方案2】:

你必须问自己:

Factory 类的不同对象会有不同的行为吗?在这种情况下,他们会以不同的方式创建新对象吗?

答案是。如果一个方法不是object scoped,那么它是static 的完美候选者。

【讨论】:

  • 即使在某些条件下创建对象的情况下,我也可以执行Foo f = Factory.getObj(String type) 之类的操作,在getObj 方法中,我可以根据给定的类型选择要实现的对象。那么我什么时候应该使用new Factory()?对不起,如果这听起来很愚蠢
  • 如果 getObj() 的定义在 Factory 类的所有实例中都相同,并且不依赖于 Factory 类的实例变量。这意味着所有getObj() 实际上都是相同的,并且可以用一个静态方法替换。
  • 你的意思是如果我有Factory.getObj() 和 Factory.getObj(String type)` 那么不要将它们设为静态是有意义的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多