作者回复: 如果一个接口只有一个实现类,也许不需要这个层次关系,即便有,一个命名可以是 DefaultXXX。 如果一个接口有多个实现类,那就需要把不同实现类的特点描述出来,比如,FileXXX,DbXXX 等等。
作者回复: 你仔细看一下,调整的过程是,先把对象变成同一个对象,然后,才是消除 static,所以,它们用的肯定是同一个对象。
作者回复: 我在几个专栏里都讨论过 Singleton 模式和 static 函数,关键点在于 static 函数如果参与到测试过程中,就不好模拟,所以,尽量不要写 static 函数。 但在这个讨论里,我也留了一个口子,就是程序库函数,用更具象的说法,就是不牵扯任何 static 字段的函数。你的场景其实是属于这种场景的。但是,在这种情况下,其实也没有必要使用 Singleton,简单的 static 函数就够了。
作者回复: 抓住重点了
作者回复: 严格地说 Impl 不直观,因为它看不出与接口之间的关系,这就好比,你说一个类名字应该叫 Class 一样,没错,但没有意义。我们应该用清晰的名字进行命名,比如,基于文件的实现就叫 FileXXX,基于数据库的实现就叫 DbXXX,基于 REST 的实现就叫 RestXXX。
作者回复: 你可以站在类型的角度去理解,其实,mock 时模拟的是一个类型,这个类型可以是用一个接口实现的,也可以是用一个类去实现的。所以,没有接口,只有类是没有问题的。