Singleton模式的替代方法?

我试图设计一个更灵活的Singleton形式。

我试图解决的问题如下:

  • 单身人士不容易测试
  • 他们滥用面向对象的方法不允许继承 ,代码变得线性,许多开发人员倾向于过度使用它们。
  • 它们仅限于一个实例 ,即复制同一机制而不重复类本身(例如,ThreadPool作为每个应用程序的单例运行方式,但每个应用程序都有自己的实例)。
  • 现在,我到目前为止提出的解决方案如下:

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

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

    问题:

  • 这个解决方案可以接
  • 是否有更好/更清洁/更短的方式来达到同样的效果?
  • 哪个版本是最好的(Singleton作为内部还是内部的构造函数)?
  • 谢谢!


    我认为你用SingletonFactory描述的解决方案是ServiceLocator模式,而你的Singletons是服务。

    这个解决方案可以接

    取决于如何以及在哪里使用单身人士。 单身人士本身并不差,只要你隔离取决于他们的代码。 否则,每次需要测试夹具时,最终都会注入一堆复杂的单体。

    如果你实例化Singletons而不是使用静态getters / setters,那么在不使用DI框架的情况下依赖注入将更加困难,除非你传入单例,但是最终可能会得到一长串参数。

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

    IoC容器和DI框架(微妙不同)通常用于控制依赖关系,否则这些依赖关系是单身人士。 然而,即使你消除了单身人士的罪恶,试图隔离对特定服务的依赖区域仍然是一个好习惯。

    链接地址: http://www.djcxy.com/p/51099.html

    上一篇: An alternative to the Singleton pattern?

    下一篇: Common Linq / Standard Query Operator mistakes/mis