黑马程序员技术交流社区

标题: 单例设计模式 概念? [打印本页]

作者: 黑马-陈思源    时间: 2013-3-28 03:10
标题: 单例设计模式 概念?
本帖最后由 黑马-陈思源 于 2013-3-28 15:42 编辑

java中单例设计模式中说是保证只生成一个对象共其他类或方法使用。
那其他类或方法使用一次岂不是生成一个新的对象啦吗?为什么说是唯一呢????
很郁闷 啊....new 都在那写这呢,虽然不能写  CLassName cn=new CLassName ();
可是  别的方法使用一次   cn=new CLassName ();    这句过一次  ,  岂不是  用一次 创建一次咯?

作者: 李尧    时间: 2013-3-28 03:30
卤煮 看这个饿汉式的例子
  1. class Single
  2. {


  3.         private  Single(){}

  4.         private static Single s = new Single();

  5.         public static  Single getInstance()
  6.         {
  7.                 return s;
  8.         }
  9. }
复制代码
构造函数被私有化,所以其他类不能通过 new来获取single的对象,只能通过 getInstance方法.
而 private static Single s = new Single();是私有并且静态的
也就是说类加载s就加载 并且只加载一次.
这个对象是共享,内存中只有一份,不会被new多个.
你再看下懒汉式
  1. class Single
  2. {
  3.         private static Single s = null;
  4.         private Single(){}
  5.         public static Single getInstance()
  6.         {
  7.                 if(s==null)
  8.                 {
  9.                         synchronized(Single.class)
  10.                         {                               
  11.                                 if(s==null)
  12.                                         s = new Single();
  13.                         }
  14.                 }
  15.                 return s;
  16.         }
  17. }
复制代码
s不存在则创建,存在则直接返回s.不会出现两个对象.
作者: 小黑黑    时间: 2013-3-28 08:27
在楼上的例子中,其实你可以看到,这个对象是被私有的,得到这个对象(确切说是它的引用,楼上的为s变量),是通过getInstance()这个方法得到的,外界访问的时候并没有创建新对象,只是拿了s这个引用型变量使用的。
而且,你是不是也发现了,上面的例子中,那个s是被static修饰的,也就是说这个对象是在类加载的时候就已经跟着加载了。所以它是属于这个类的,也就是仅有一份。关于静态的知识你可以看看相关的资料和总结。
作者: 胡军    时间: 2013-3-28 09:01
  1. class Single
  2. {
  3.         private  Single(){}//将构造函数私有化

  4.         private static Single s = new Single();//自己建立对象,注意static修饰符

  5.         public static  Single getInstance()//返回新建对象引用的方法
  6.         {
  7.                 return s;
  8.         }
  9. }
复制代码
这是饿汉式。
当加载该类的时候,由于Single对象s是静态的,所以会被加载到方法区的静态区并被执行,因此该类一被加载,堆内存中就已经建立该对象。其它类在使用时调用方法getInstance()得到的只是该对象的引用。注意只是得到了该对象的地址,自始至终堆内存中只有一个对象。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2