Javascript 单例是众所周知的坏习惯,角度是基于单例。棱角不好吗?

Javascript 单例是众所周知的坏习惯,角度是基于单例。棱角不好吗?,javascript,angularjs,design-patterns,singleton,Javascript,Angularjs,Design Patterns,Singleton,Angular中的所有服务都是单例服务。单身是众所周知的坏习惯 我知道很多人(包括我)都很喜欢我。 我在这里遗漏了什么?Singleton是一种非常有用的模式。很难想象没有它构建软件!例如,想象一下,不断地重新创建一个散列一百万条记录的对象 问题在于执行: 它们通常被用作一个全局实例,为什么这么糟糕? 因为您将应用程序的依赖项隐藏在 代码,而不是通过接口公开它们。做点什么 避免传递它的全局性是一种代码气味 他们违反了单一责任原则:根据 他们控制自己的创作和生命周期 它们内在地导致代码紧密耦合。

Angular中的所有服务都是单例服务。单身是众所周知的坏习惯

我知道很多人(包括我)都很喜欢我。
我在这里遗漏了什么?

Singleton是一种非常有用的模式。很难想象没有它构建软件!例如,想象一下,不断地重新创建一个散列一百万条记录的对象

问题在于执行:

它们通常被用作一个全局实例,为什么这么糟糕? 因为您将应用程序的依赖项隐藏在 代码,而不是通过接口公开它们。做点什么 避免传递它的全局性是一种代码气味

他们违反了单一责任原则:根据 他们控制自己的创作和生命周期

它们内在地导致代码紧密耦合。这就造成了伪造 在许多情况下,测试它们是相当困难的

在应用程序的生命周期中,它们始终保持状态。另一个 点击测试,因为最终可能会出现需要测试的情况 这对于单元测试来说是一个很大的禁忌。为什么?因为每个 单元测试应该独立于其他测试

大部分批评似乎指向了一种非常老式的单例模式实现,这种模式在全球范围内都可用:

public class ClassicSingleton {
   private static ClassicSingleton instance = null;
   protected ClassicSingleton() {
      // Exists only to defeat instantiation.
   }
   public static ClassicSingleton getInstance() {
      if(instance == null) {
         instance = new ClassicSingleton();
      }
      return instance;
   }
}
使用依赖项注入容器(如angular或spring)可以克服上述大多数问题。容器处理生命周期并将单例实例注入客户机代码。出于测试目的,始终可以使用不同的单例替换注入的单例


简而言之,使用DI容器可以很容易地使用单例而不会产生潜在的不良影响。

这听起来更像是逻辑谬误,而不是真正的问题。这是一个基于观点的大胆陈述。我不认为每个开发人员都会同意单身是不好的。如果使用得当,它们会非常有用(我的观点)。你的比较是错误的!Singleton只解决一个问题,即角度服务在资源争用中发挥作用。Singleton!=单实例