当Singleton设计模式优于静态类和&时,有哪些场景?什么时候静态类优于Singleton设计模式?
答案 0 :(得分:7)
一般来说,单身人士优于静态班级。
Singleton :
如果您选择静态类然后选择具体,则没有灵活性。但是,如果您使用 singleton ,则必须记住对其进行实例化thread safe。
答案 1 :(得分:6)
这不是一个或两个场景。
单身人士是具有静态getter和私有构造函数的实例。它们不是静态类。
具有某些附带条件的Singleton是确保您只有一个类实例的方法。
所以第一个问题是。你需要一个实例,即这个东西是否有状态,第二个问题是他们进行单元测试有多困难,你想要一个吗?
例如,查看服务定位器模式。
答案 2 :(得分:3)
如果您仅使用某个类作为某些函数的容器,请使用静态类..但在大多数其他情况下,您最好使用Singleton设计模式,因为您“' ll可能想要重用该对象或将其实例化为非单例。
答案 3 :(得分:2)
答案 4 :(得分:1)
我最后的讨论: 1.一个物体有一些状态。 State表示对象属性的当前值。 因此,如果您想要一个场景,您希望某个状态可以更改,并且只想拥有一个实例,那么请使用Singleton类。例如假设有一个日志文件要在某些成功操作后或某些异常后更新。要更新此日志文件,我们必须对其进行锁定以避免任何不一致的数据,并且可以通过Singleton类来实现。 2.当您不需要对象状态并希望在应用程序启动时将您的类加载到内存中时。留在那里直到应用程序的生命 - 使用静态类。
答案 5 :(得分:0)
您可以使用静态类为您提供不需要任何状态的简单方法,以及何时不需要实例化对象。
使用单例表示您只需要对对象进行一次实例化,然后可以传递它并改变其状态。使用单例,您还可以继承或实现接口。
答案 6 :(得分:0)
两者之间的主要区别在于单例可以实现接口,并且允许根据测试或运行时原因更改其行为。静态类是静态的,虽然它可以具有状态,但是它的行为会很难改变。
作为类的实例的单例可以实现接口,如果与期望该接口的方法一起使用,可以很容易地用不同的行为替换。
记录是两者的常见用法。
静态记录器不太可能能够记录到不同的介质(数据库,xlm文件,文本文件,json,流,webservice),因为您必须使用不同的API进行调用,或者设置一些状态和然后让所有方法都能阻止所有不同类型的持久性。
单例记录器可以实现ILog,然后如果需要从日志记录切换到数据库以记录到Web服务,则只需使用另一个类(可能是也可能不是单例)。
单身可以用来缓慢地远离静态类。当你意识到你永远不会改变行为时,静态类可以取代单例。
两者都难以自我测试。但是测试使用它们的其他类可能是个问题。特别是一个静态类 - 在测试和生产时,在某些方面(比如记录,或者文件的源/目标是文件共享与共享点)要求稍微不同的行为并不是未知的。在这种情况下,让类成为单身可以更容易地改变这种行为。