单例设计模式vs静态类

本文关键字:静态类 vs 设计模式 单例 | 更新日期: 2023-09-27 18:01:48

单例设计模式优于静态类的情况有哪些?当静态类优于单例设计模式?

单例设计模式vs静态类

这不是一个非此即彼的场景。

单例是具有静态getter和私有构造函数的实例。它们不是静态类。

带有特定条件的单例是一种确保你只有一个类实例的方法。

第一个问题是。你是否需要一个实例,也就是说,这个东西是否有一个状态,第二个问题是考虑到它们使单元测试变得多么困难,你是否想要一个。

看一下服务定位器模式,例如。

一般来说,单例类要优于静态类。

单例静态类:

  • 可以继承,也可以继承;
  • 可实现接口;
  • 可以序列化;
  • 可以传递给其他类;
  • 可以处理。

如果你选择静态类那么你选择具体的,没有灵活性。然而,如果你使用单例,你必须记住使它的实例化线程安全。

如果您只使用类作为某些函数的容器,请使用静态类。但在大多数其他情况下,您最好使用单例设计模式,因为您可能希望重用该对象或将其实例化为非单例。

静态类是比较难测试的。而且你不能用构造函数做任何有用的事情。

静态类在像MVC帮助器这样的帮助器方法中是首选的。

您可以在这里看到静态类的限制。

我最后的结论是:1. 一个对象有某种状态。状态表示对象属性的当前值。所以,如果你想有一个场景,你想有一些可以改变的状态,也想只有一个实例,那么使用Singleton类。例如,假设有一个日志文件,你想在一些成功的操作或一些异常后更新。为了更新这个日志文件,我们必须对它进行锁定,以避免任何不一致的数据,这可以通过Singleton类来实现。2. 当你不需要对象的状态,并希望在应用程序启动时将类加载到内存中时&使用静态类

您可以使用静态类来提供不需要任何状态的简单方法,并且当您不需要实例化对象时

使用单例意味着你只需要实例化一个对象一次,你可以传递它并改变它的状态。使用单例,你还可以继承或实现一个接口。

两者之间的主要区别在于单例可以实现接口,并且允许出于测试或运行时原因更改其行为。静态类是静态的,虽然它可以有状态,但要彻底改变它的行为是很困难的。

作为类实例的单例可以实现一个接口,如果与期望该接口的方法一起使用,则可以很容易地用不同的行为替换。

日志记录是两者的常见用法。

静态日志记录器不太可能能够记录到不同的介质(数据库、xlm文件、文本文件、json、流、webservice),因为您要么必须为调用使用不同的API,要么设置一些状态,然后让所有方法实现所有不同类型的持久性。

单例日志记录器可以实现ILog,然后如果你需要从记录数据库切换到记录web服务,你只需要使用另一个类(可能是也可能不是单例)。

单例可以用来缓慢地脱离静态类。当你意识到你永远不会改变行为时,静态类可以取代单例类。

两者本身都很难测试。但是测试使用它们的其他类可能会有问题。特别是,静态类——在测试和生产时,在某些方面(比如日志记录,或者文件的源/目标是文件共享而不是sharepoint)想要稍微不同的行为是不为人知的。在这种情况下,让类成为单例可以更容易地改变这种行为。