Scala库设计:可以使用静态工厂方法创建对象吗?

时间:2016-09-29 11:03:14

标签: scala library-design

我在Scala中创建了一个库。它是一个带有不同实现的解析器。从一切中抽象出来的特征看起来像这样(简化):

trait Parser {
  def parse(in: Array[Byte]): Array[Byte]
}

库提供的具体解析器实现扩展了上面的特性(没什么了不起的。)

class FastParser(...) extends Parser...
class HighQualityParser(...) extends Parser...

由于我不希望客户端依赖于具体的实现类(我甚至考虑过将它们设置为私有),我使用了特性的伴随对象,它提供了对解析器的访问而不暴露它们的类型:

object Parser {
  def getFastParser: Parser = new FastParser(...)
  def getHighQualityParser: Parser = new HighQualityParser(...)
}

用户还应该能够使用他们自己的Parser特征实现

但是,我不确定这是否是最佳方法。

  • 这种方法有什么普遍的缺点吗?
  • 如何使用访问修饰符隐藏这两个实现?从客户的角度来看,是否有理由访问实现?

您可能认为这些是关于松散耦合和抽象的非常基本的问题。这不一定是这种情况,我自己一直使用依赖注入框架和类似的东西。然而;我以前从未发布过图书馆,发现很难提供一些可以灵活使用的东西而不会变得复杂。

0 个答案:

没有答案