如何实现单一工厂模式?

时间:2015-02-12 20:15:58

标签: scala

我想要一些类型' ValidatedVals'可以由一个类专门实例化(即它是ValidatedVals的单一工厂)。

然后我想在许多其他类中引用此ValidatedVals类型。

私人建筑师似乎只是一个答案......但是......

下面的代码失败,因为(显然)是一个带有私有构造函数的内部类,在

中声明
object X{  ... }

使得构造函数在对象X

中不可见

所以,在下面的代码中,我该如何做到:

  • ONLY ValidatedValsFactory可以构造ValidatedVals对象
  • AND 我可以在其他类中引用ValidatedVals类型吗?

_

class ValidatedValsFactory {}

object ValidatedValsFactory {

  class ValidatedVals private (val a: Int, val b: Int) {}

  def validate(a: Int, b: Int): Unit = { /* .... */ }

  def makeValidated(a: Int, b: Int): ValidatedVals = {
    validate(a, b);
    // **** Nope. Fail. Not visible. *****
    return new ValidatedVals(a, b)
  }
}

class ValidatedValsConsumer {
  def f(param: ValidatedValsFactory.ValidatedVals): Unit = { /* ... */ }
}
  • 我不希望f&f的参数类型成为一个接口(因为它很容易通过实现接口来绕过验证)。
  • 我无法将ValidatedVals类移到ValidatedValsFactory的类定义中,因为ValidatedValsConsumer需要能够引用内部类的typename(因此ValidatedVals必须是静态声明)。

garrghh!

2 个答案:

答案 0 :(得分:2)

如果您将对象设为私有对象,则看起来编译错误会消失:

class ValidatedVals private[ValidatedValsFactory] (val a: Int, val b: Int) {}

答案 1 :(得分:1)

考虑将您的ValidatedVals类型声明为密封类或特征。更多详情:What is a sealed trait?