1

让我们假设我们有一个将在 (c#) 代码中广泛使用的类,例如 Log 类。假设日志将条目写入特定目录中的 XML 文件。现在,强制用户使用所需信息初始化类的一种尝试是将默认(无参数)构造函数设为私有,并提供一个采用logdirectory参数的构造函数。这样做的缺点是,用户每次需要将某些内容写入日志并因此创建 Log 类的实例时,都需要提供参数。

还有哪些其他选择?提前感谢您的回复。

4

5 回答 5

4

四个选项(主要包括,但没有明确和一起):

  • 只需将调用设为静态,并包括静态初始化。这对于测试(依赖于它的类)来说是可怕的,但非常简单。

  • 按照大多数其他答案的建议使用单例。从测试的角度来看,这可能会更好(您可以使用内部方法来替换单例仅用于测试目的),并实现一个用于模拟目的的接口。

  • 使用依赖注入:让所有需要依赖的东西都放在构造函数或其他东西中,然后让你的 DI 框架连接所有东西。从测试的角度来看要好得多,但它并不完全方便。

  • 使用工厂 - 就像单例一样,但将实现与构造分开。(它可能实际上最终成为一个单例,但没有那么多假设。)

于 2009-03-24T15:06:47.270 回答
1

我认为您要搜索的术语是单例模式。我不会在这里完整地写出来——这是一个非常适合谷歌的术语。但基本上你在应用程序加载时初始化对象的单个实例,然后在整个应用程序中引用同一个实例

于 2009-03-24T14:54:22.227 回答
0

你是如此接近......将其实现为单例,并且您不需要多次初始化。简短的回答是在自身内部创建一个类的静态公共实例和一个公共静态方法,该方法(a)如果它当前为空,则初始化该实例,或者(b)返回已经初始化的实例。

单例模式还有更多细节需要考虑,但这应该可以帮助您入门。

于 2009-03-24T14:55:29.823 回答
0

只需将 Logger.Log() 函数设为静态调用,并让它引用一个静态成员,即目录信息。然后,您只需在执行开始时设置一次目录信息成员,随后对 Logger.Log() 的所有调用都将“正常工作”。

于 2009-03-24T14:57:26.120 回答
0

辛格尔顿。您可以使用静态类,因此不必实例化它。然后,如果你有一个日志目录,有一个默认的日志路径和一个可空参数到 writelog 方法或覆盖的方法签名,一个接受路径,一个假设来自配置文件的默认值。

于 2009-03-24T14:58:34.263 回答