关于创建Singleton模式

aimhard2005 2007-08-13 10:02:50
看到有如下两种方法
不明白的地方是
为什么第二种方法只是第一次     
使用时生成实例,提高了效率??
倒是如何初始话的
恳望详解,谢谢!


  一般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;   }
}


...全文
235 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanqingfei 2008-01-16
  • 打赏
  • 举报
回复
为什么第二种方法只是第一次     
使用时生成实例,提高了效率??

当然只有第一次时生成了,其他时候一判断就用原来的那个了。。。
c30gcrk 2008-01-16
  • 打赏
  • 举报
回复
好帖,顶上去,singleton模型对提高健壮性很有帮助
hoszone 2008-01-16
  • 打赏
  • 举报
回复
根据实际需求
树成 2007-08-14
  • 打赏
  • 举报
回复
单例有五种写法,第一种就是上述的第二种,这种写法只是简单的实现单例而已。
第二种是在上一种上加线程锁,解决线程不安全问题。
第三种是在线程锁上再加一个if判定锁,解决线程锁损耗资源问题。
第四种就是上述的第一种写法,直接实例化。
第五中就是改进第四种的,是用一个内部类来解决延迟加载的问题,因为第四种是立即加载了。
vitamins 2007-08-14
  • 打赏
  • 举报
回复
LZ看来对Singleton模式不是很理解啊,其实Singleton的作用就是为了安全,在WEB开发中大量采用这中模式,它是不允许客户端生成多个实例。
提示LZ一句,学习模式不是为了要用而去用,而是为了提供程序的质量,健壮。和学习模式处理问题的一种思想。
roypayne 2007-08-14
  • 打赏
  • 举报
回复
路过,学习.
chenhongxin 2007-08-14
  • 打赏
  • 举报
回复
public class Singleton {
  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一个,如果有,就直接返回这个实例。
luyang1016 2007-08-13
  • 打赏
  • 举报
回复
没有任何理由使用第二种方式,除非你的对象占用巨大的内存

=============

我持有不同观点.
从效率考虑,特别是当初始化的时候牵涉到复杂的sql时候,有时候还是要考虑方式二的.

到底是选择1还是2 , 需要自己权衡利弊,根据不同的情况选择决定.
单纯说谁好谁不好,我觉得有点片面.
luyang1016 2007-08-13
  • 打赏
  • 举报
回复
public class Singleton {
  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一个,如果有,就直接返回这个实例。

好像还有个模型的,不太记得了。
treeroot 2007-08-13
  • 打赏
  • 举报
回复
标准的是第一种写法,应该说效率更高,不过是先初始化先在内存而已
第二种是第一次用的时候初始化,存在线程安全问题。

没有任何理由使用第二种方式,除非你的对象占用巨大的内存

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧