Singleton design pattern vs static class
当单例设计模式优于静态类时,以及当静态类优于单例设计模式时,会出现什么情况?
型
一般来说,单例类优于静态类。
与静态类相反的单件:
- 百万千克1可以继承,也可以继承;百万千克1百万千克1能实现接口;百万千克1百万千克1可以序列化;百万千克1百万千克1可以传给其他班级;百万千克1百万千克1无法释放。百万千克1
型
如果选择静态类,那么选择具体类,就没有灵活性。但是,如果使用singleton,则必须记住保证它的实例化是线程安全的。
型
这不是一个非此即彼的方案。
单例是具有静态getter和私有构造函数的实例。它们不是静态类。
带有某些限制条件的singleton是一种确保类只有一个实例的方法。
所以第一个问题是。你需要一个实例吗,也就是说,这个东西有状态吗,第二个问题是,它们使单元测试有多困难,你想要一个吗?
例如,看看服务定位器模式。
型
如果只使用类作为某些函数的容器,请使用静态类。但在大多数其他情况下,最好使用单例设计模式,因为您可能希望重用该对象或将其实例化为非单例。
型
静态类是很难测试的专业。您不能将构造函数用于任何有用的内容。
静态类在帮助程序方法(如MVC帮助程序)中是首选的。
您可以在这里看到静态类的限制。它们只能有静态成员并且是密封的。
型
我从这次讨论中得出的最后结论:1.对象具有某种状态。状态是指对象属性的当前值。所以,如果您希望有一个场景,其中您希望有一些可以更改的状态,并且只希望有一个实例,那么使用singleton类。例如,假设有一个日志文件要在某个成功操作后或在某个异常情况下更新。要更新这个日志文件,我们必须锁定它以避免任何不一致的数据,并且可以通过singleton类来实现。2.第二步。当您不需要对象的状态,并且希望在应用程序启动时将类加载到内存中时,请一直保留到应用程序的生命周期-使用静态类。
两者之间的主要区别在于,单例可以实现接口,并且允许出于测试或运行时的原因更改它的行为。静态类是静态的,虽然它可以有状态,但是要彻底改变它的行为是很困难的。
作为类的实例,单例可以实现接口,如果与期望该接口的方法一起使用,则可以很容易地用不同的行为替换。
日志记录是两者的常见用法。
静态记录器不太可能记录到不同的媒体(数据库、XLM文件、文本文件、JSON、流、WebService),因为您要么对调用使用不同的API,要么设置一些状态,然后让所有的方法驱动所有不同类型的持久性。
单例日志记录器可以实现ILOG,然后,如果需要从日志记录切换到数据库,再切换到日志记录到Web服务,则只需使用另一个类(可能是单例日志,也可能不是单例日志)。
单例可以用来缓慢地离开静态类。当您意识到永远不会改变行为时,静态类可以替换单例。
两者本身都不难测试。但是测试其他使用它们的类可能是一个问题。尤其是静态类——在测试与生产时,在某些方面(比如日志记录,或者让文件的源/目标是文件共享与SharePoint)想要稍微不同的行为,这是未知的。在这种情况下,将类设为单例允许更容易地更改该行为。
型
您可以使用一个静态类为您提供简单的方法,这些方法不需要任何状态,也不需要初始化对象。
使用singleton意味着您只想实例化一个对象一次,并且您可以传递它并改变它的状态。使用单例,您还可以继承或实现接口。