A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李大伟 高级黑马   /  2013-4-30 10:20  /  1349 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李大伟 于 2013-4-30 16:15 编辑

求单例设计模式写法,和说明,详细 ,谢谢

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

6 个回复

倒序浏览
这是我从别地方烤来的希望对你有帮助
解决的问题:保证一个类在内存中的对象唯一性。
比如:多程序读取一个配置文件时,建议配置文件封装成对象。会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的。
Runtime()方法就是单例设计模式进行设计的。
如何保证对象唯一性呢?
思想:
1,不让其他程序创建该类对象。
2,在本类中创建一个本类对象。
3,对外提供方法,让其他程序获取这个对象。
步骤:
1,因为创建对象都需要构造函数初始化,只要将本类中的构造函数私有化,其他程序就无法再创建该类对象;
2,就在类中创建一个本类的对象;
3,定义一个方法,返回该对象,让其他程序可以通过方法就得到本类对象。(作用:可控)
代码体现:
1,私有化构造函数;
2,创建私有并静态的本类对象;
3,定义公有并静态的方法,返回该对象。
---------------------------------------------
//饿汉式
class Single{
private Single(){} //私有化构造函数。
private static Single s = new Single(); //创建私有并静态的本类对象。
public static Single getInstance(){ //定义公有并静态的方法,返回该对象。
return s;
}
}
---------------------------------------------
//懒汉式:延迟加载方式。
class Single2{
private Single2(){}
private static Single2 s = null;
public static Single2 getInstance(){
if(s==null)
s = new Single2();
return s;
}
}

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
本人已死 发表于 2013-4-30 10:29
这是我从别地方烤来的希望对你有帮助
解决的问题:保证一个类在内存中的对象唯一性。比如:多程序读取一个 ...

饿汉式 private static Single s = new Single();
是卸载私有化构造函数的前边还是后边啊!!!
回复 使用道具 举报
下面是我通过学习毕老师java基础视频,自己总结出来的。
单例设计模式:解决一个类在内存只存在一个对象。

        思想:想要保住对象唯一。
        <1>.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象。
        <2>.还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。
        <3>.为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

        这三步怎么用代码体现呢?
        <1>.将构造函数私有化。
        <2>.在本类中创建一个本类对象。
        <3>.提供一个方法可以获取到该对象。
    注意:对于事物该怎么描述,还怎么描述。
          当需要将该事物的对象保证在内存中唯一时,就将以上三步加上即可。

    (一)这个是先初始化对象。称为:饿汉式
       饿汉式代码如下:
  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.         }
  10.         class SingleDemo
  11.         {
  12.                 public static void main(String[] args)
  13.                 {
  14.                         Single ss = Single.getInstance();
  15.                 }
  16.         }
复制代码
其他程序只能通过getInstance()方法来操作本类对象了。
        方法被调用只有两种方式可以进行:1,建立对象 2,类名调用。
        构造函数已被私有了,不可能建立对象了。
        方法只能用被类名调用,能用类名调用,这个方法就要static标识。
        同时静态方法在访问类中的成员s,所以成员 s 也要被static。
        s同时是类中的变量,所以通常要private。
    特点: 这种单例设计模式称为懒汉式。在调用getInstance()方法时,
    这唯一对象的就创建好了,直接拿到使用。这种思想是空间换时间
    对象早早的建立好存放在那,只有来拿就好了。

   
    (二)对象是方法被调用时,才初始化,也叫做对象的延时加载。称为:懒汉式
       懒汉式代码:
  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.         }
复制代码
特点:这种单例设计模式的特点是当通过对外提供的取得单例的方式获取对象时,
        先判断对象时候存在,如果不存在,那么就创建一个,否则直接使用已经存在的对象。
        但是,if(s == null )这句话容易出现并发操作,如果两个线程同时来取对象,
        判断条件为null,那么就会创建多个对象,所以当判断条件后,再使用一个同步代码块
        来实现线程的同步,再在里面使用if判断,来判断对象是否存在。这种使用双重if判断
        以及使用同步关键synchronized的方式可以稍微提高一下效率。
        这种单例模式设计的思想是:时间换空间。当通过getInstance()来获取对象时,
        才创建实例,这样可以节省空间,但是效率略低。
    记录原则:定义单例建议使用饿汉式。
回复 使用道具 举报
格式和相关说明大家已经提了不少了,我也没啥补充的,我用单例设计模式写个生产消费的例子吧,希望能帮到你
  1. class Resource
  2. {
  3.         private String name;
  4.         private int count = 0;
  5.         boolean flag = false;
  6.         private Resource(){}
  7.         private static final Resource r = new Resource();
  8.         public static Resource getInstance()
  9.         {
  10.                 return r;
  11.         }
  12.         public synchronized void set(String name)
  13.         {
  14.                 while(flag)
  15.                         try{this.wait();}catch(Exception e){};
  16.                 this.name = name;
  17.                 System.out.println(Thread.currentThread().getName()+"..."+this.name+"..."+(++count));
  18.                 flag = true;
  19.                 this.notifyAll();
  20.         }
  21.         public synchronized void out()
  22.         {
  23.                 while(!flag)
  24.                         try{this.wait();}catch(Exception e){};
  25.                 System.out.println(Thread.currentThread().getName()+"......"+name+"..."+count);
  26.                 flag = false;
  27.                 this.notify();
  28.         }
  29. }
  30. class Input implements Runnable
  31. {
  32.         Resource rs = Resource.getInstance();
  33.         public void run()
  34.         {
  35.                 while(true)
  36.                 {
  37.                         rs.set("商品");       
  38.                 }
  39.         }
  40. }
  41. class Output implements Runnable
  42. {
  43.         Resource rs1 = Resource.getInstance();
  44.         public void run()
  45.         {
  46.                 while(true)
  47.                 {
  48.                         rs1.out();
  49.                 }
  50.         }
  51. }
  52. class ShengchanXiaofeiDanli
  53. {
  54.         public static void main(String[] args)
  55.         {
  56.                 new Thread(new Input()).start();
  57.                 new Thread(new Input()).start();
  58.                 new Thread(new Output()).start();
  59.                 new Thread(new Output()).start();
  60.         }
  61. }
复制代码
回复 使用道具 举报
        上面大家都说很多了 我也不给你总结了 我给你说下是哪个视频吧  毕向东老师 在第六天 第9个和第十个10频中有简单说明  
回复 使用道具 举报
好的明白了,谢谢大家
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马