2012-03-26 89 views
5

我正在为应用程序创建记录器。我正在使用第三方记录器库。在哪个记录器被实现为单例。正在扩展单例类错误吗?

我扩展了记录器类,因为我想添加更多的静态函数。在这些静态函数中,我在内部使用Logger(我继承)的实例(这是单个)。

我既没有创建MyLogger的实例,也没有重新实现超类的getInstance()方法。 但我仍然收到类似MyLogger析构函数的警告,因为父类(Loggger)析构函数无法访问而无法创建。我想知道, 我是否做错了什么? 继承单例错误或应该避免?

回答

4

离开Singleton模式的优点一边(有思想的一所学校,将其描述为一个反模式),它不应该是必要它简单地添加静态功能。下面是我宁愿子类单身特定语言的方法:

  • 使用一个独立的功能封装在一个C++的命名空间
  • 使用在C#
  • 在Java中使用一个辅助类的扩展类
  • 使用范畴在Objective-C
+0

我正在使用C++语言,我正在考虑创建一个只能从单例记录器类继承的静态方法的包装类。怎么样?? 你会详细阐述一下你在C++中描述的方法吗? 谢谢.. – EngineeredBrain 2012-03-26 18:03:01

+0

@AnwarShaikh这也适用 - 这是我在Java中所做的,因为独立函数在那里不可用。我也会在C++中使用这条路线,但前提是我需要在我添加的函数中共享状态或其他实现细节。 – dasblinkenlight 2012-03-26 18:05:23

+0

谢谢!我会通过编写一个封装来尝试。 – EngineeredBrain 2012-03-26 18:20:13

0

我会在需要的地方使用非单例和委托调用单例。每当你有机会摆脱一个单身人士时,就去做吧。

+0

是的,确实需要避免使用singletons,但是当它用于Logger之类的东西时,结果很好。 如果我需要一些额外的方法以及那些单身人士,我该如何继承它,或者在内部使用单身人士的单身人士身上编写包装(只有静态方法的类)。 – EngineeredBrain 2012-03-26 18:36:35

+0

去一个包装。这就是我所说的“代表呼叫”。 – 2012-03-26 19:06:06

0

我同意加勒特大厅,你应该避免辛格尔顿的,如果possbile。这就是说,我不认为有一个原因是错的。实施Singleton的人让你扩展它。如果api开发人员不希望单身类Logger被扩展,那么他们会使构造函数成为私有的,例如C++,或者任何适用于您正在使用的语言的方法。

0

我觉得写一个包装过类是不正确的解决方案,因为你需要编写包装器每次从单需要方法。最后你写了几十个函数。

此外,您还限制自己使用单身人士提供的所有功能。

不是一个好主意!