看到有如下两种方法
不明白的地方是
为什么第二种方法只是第一次
使用时生成实例,提高了效率??
倒是如何初始话的
恳望详解,谢谢!
一般Singleton模式通常有几种种形式: 第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。 public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
} 第二种形式: public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
不明白的地方是
为什么第二种方法只是第一次
使用时生成实例,提高了效率??
倒是如何初始话的
恳望详解,谢谢!
一般Singleton模式通常有几种种形式: 第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。 public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
} 第二种形式: public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
这个标准叫饿汉模型。
外部直接调用getInstance来得到这个类。只要外界有需求,我就加载一次这个类。
个人建议,再加上一个私有的构造函数,才能称得上完整地饿汉模型。 private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
这个标准叫懒汉模型。就是说,这个类在整个应用中只会被加载一次,下次有人要加载的时候,先到内存中找,有没有该类的实例存在,如果没有,就new一个,如果有,就直接返回这个实例。好像还有个模型的,不太记得了。
从效率考虑,特别是当初始化的时候牵涉到复杂的sql时候,有时候还是要考虑方式二的.到底是选择1还是2 , 需要自己权衡利弊,根据不同的情况选择决定.
单纯说谁好谁不好,我觉得有点片面.
提示LZ一句,学习模式不是为了要用而去用,而是为了提供程序的质量,健壮。和学习模式处理问题的一种思想。
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
这个标准叫饿汉模型。
外部直接调用getInstance来得到这个类。只要外界有需求,我就加载一次这个类。
个人建议,再加上一个私有的构造函数,才能称得上完整地饿汉模型。 private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
这个标准叫懒汉模型。就是说,这个类在整个应用中只会被加载一次,下次有人要加载的时候,先到内存中找,有没有该类的实例存在,如果没有,就new一个,如果有,就直接返回这个实例。