Singleton模式的替代方案?

Mos*_*ner 4 architecture singleton design-patterns

我正在尝试设计一种更灵活的Singleton形式.

我想解决的问题如下:

  • 单身人士无法轻易进行测试.
  • 他们滥用面向对象的方法,不允许继承,代码变得线性,许多开发人员倾向于过度使用它们.
  • 它们仅限于一个实例,在重复相同机制的意义上而不重复类本身(例如,ThreadPool作为每个应用程序的单例操作的方式,但每个应用程序都有自己的实例).

现在,我到目前为止提出的解决方案如下:

  • 使Singleton类成为具有内部构造函数的常规公共类(只能由同一个包的类访问).
  • 与每个面向产品的类一样,所有静态属性和静态常量都被移动到一个内部SingletonShared类,该类将作为参数传递给Singleton的构造函数.这两个隐藏在公众背后SingletonFactory,具有静态方法getInstance(key).
  • 在情况下,我们所面对的是更复杂的系统,其中每个单需要它自己的一套独特的参数,我加的静态方法setAdapter(adapter)SingletonFactory.使用该方法getShared(key),实现的类ISingletonAdapter 应该返回该SingletonShared实例的值(例如, SingletonXmlAdapter将Xml文件传递给构造函数,并根据给定的键对某个节点进行反序列化).

以上所有都包装Singleton在一起.

现在,出于测试能力的目的,可以选择将Singleton标记为内部类,并使其实现ISingleton公共接口.

问题:

  1. 这个解决方案可以接受
  2. 是否有更好/更清洁/更短的方法来达到同样的效果?
  3. 哪个版本最好(Singleton作为内部与构造函数作为内部)?

谢谢!

Gar*_*all 5

我认为您所描述的解决方案SingletonFactoryServiceLocator模式,而您的Singletons是服务.

这个解决方案可以接受

依赖如何在那里使用单身.单身人士本身并不坏,只要你孤立依赖他们的代码.否则,每次需要测试夹具时,最终会注入一堆复杂的Singletons.

如果你实例化Singletons而不是使用静态getter/setter,那么在不使用DI框架的情况下依赖注入会更加困难,除非你传递单身,但最后你可以得到一长串参数.

是否有更好/更清洁/更短的方法来达到同样的效果?

IoC容器DI框架(微妙的不同)通常用于控制否则将成为单例的依赖关系.然而,即使您消除了Singletons的邪恶,尝试隔离对特定服务的依赖区域仍然是一种好习惯.