YoK*_*YoK 18
Singleton类:Singleton类是每个类加载器只能存在单个实例的类.
静态/帮助程序类(仅包含静态字段/方法的类):不存在此类的实例.只能将字段和方法作为常量或辅助方法直接访问.
以下是从这篇博客中引用的" Java中的静态类 "很好地描述了它.该博客也有解释相同的例子:
单例示例:
public class ClassicSingleton {
private static ClassicSingleton instance = null;
private ClassicSingleton() {
// Exists only to defeat instantiation.
}
public static ClassicSingleton getInstance() {
if (instance == null) {
instance = new ClassicSingleton();
}
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
静态类示例:
/**
* A helper class with useful static utility functions.
*/
public final class ActionHelper {
/**
* private constructor to stop people instantiating it.
*/
private ActionHelper() {
// this is never run
}
/**
* prints hello world and then the users name
*
* @param users
* name
*/
public static void printHelloWorld(final String name) {
System.out.println("Hello World its " + name);
}
}
Run Code Online (Sandbox Code Playgroud)
那么这两个例子之间有什么区别?为什么我认为第二个解决方案对于你不想要或不需要实例化的类更好.首先,如果要创建一个类的实例,Singleton模式非常有用.对于我的助手类,我们并不想真正实例化该类的任何副本.你不应该使用Singleton类的原因是因为对于这个助手类我们不使用任何变量.如果单例类包含一组我们只需要一组的变量并且方法使用那些变量,那么单例类将是有用的但是在我们的帮助器类中,除了传入的变量之外我们不使用任何变量(我们做的是最终的) .出于这个原因,我不相信我们想要一个单例实例,因为我们不需要任何变量,我们不要 我想要任何人实例化这个类.因此,如果您不希望任何人实例化该类,通常如果您有某种类型的helper/utils类,那么我使用我称之为静态类的类,一个带有私有构造函数的类,并且只包含静态方法而没有任何类任何变量.
同样的答案也从我的回答中引用在这里
Pra*_*ana 16
SO上的旧que/ans:静态类和单例模式之间的区别?
静态类是仅具有静态方法的类,对于该类,更好的单词将是"函数".静态类中体现的设计风格纯粹是程序性的.
另一方面,Singleton是OO设计特有的模式.它是一个对象的实例(具有其中固有的所有可能性,例如多态性),具有创建过程,该过程确保在其整个生命周期中只有该特定角色的一个实例.
差异不是正确的问题.因为与静态相比,单身人士不是关键词.你应该问"何时选择哪一个?".单例类比静态类有什么优势,这些问题出现在设计阶段.
Singleton:用法:用作全局配置的类,例如:具有一个数据库连接的软件的试用版,每个jvm的JDK Runtime类实例.
什么时候去:1.在开发代码时,你会想到前向兼容性,就像明天你需要将这个单例类转换为普通类或允许子类化一样.2.当这个单例类很重时,你可以提供延迟加载功能.
static:用法:基本上执行转换,实用程序功能的类.请检查数学课程.
什么时候去:1.辅助类,由api开发中的所有类使用.
缺点:1.课程急切加载.
期待别人的积分.
这是模式和模式实现方式之间的区别。
Singleton 模式并不专门与 Java 语言相关。将类变成单例可能有不同的方法,具体取决于您使用的语言。许多面向对象语言使用静态变量的等效项来创建单例,但其他语言可能使用不同的技术。
此外,某些实现单例的方法比其他方法更好。实现单例的一种好方法是通过工厂方法正确封装对该单例的访问:
public class Example {
private static final Example SINGLETON = new Example();
public static Example getInstance() { return SINGLETON; }
private Example() { /* Constructor */ }
}
Run Code Online (Sandbox Code Playgroud)
使用这种技术,您可以执行各种复杂的操作:延迟加载单例、用某些子类替换它、通过配置管理单例初始化等等。
| 归档时间: |
|
| 查看次数: |
79827 次 |
| 最近记录: |