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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class Single{
  2.        
  3.         private static Single s =null;
  4.         private Single() { }
  5.        
  6.         public static Single getInstance(){
  7.                 if(s == null)
  8.                         s = new Single();
  9.                 return s;
  10.         }
  11.        
  12. }
  13. public class SingleDemo {

  14.         public static void main(String[] agrs){
  15.                
  16.                 Single s = null;
  17.                 s = s.getInstance();;
  18.                
  19.                 System.out.println(s);
  20.         }
  21. }
复制代码
这个单例设计模式是怎么保证对象的唯一性的啊?有什么意义?

13 个回复

倒序浏览
单例设计模式是通过private 方式在Single类的内部创建对象,然后只提供给外界一个getSingle()方法,让外界获取实例对象,目的是为了保证外界只能使用Single类的唯一一个实力对象。
回复 使用道具 举报
李永佳 发表于 2016-1-5 10:54
单例设计模式是通过private 方式在Single类的内部创建对象,然后只提供给外界一个getSingle()方法,让外界 ...

唯一一个实例,在什么方面有用处呢?
回复 使用道具 举报
getInstancepublic static Calendar getInstance()使用默认时区和语言环境获得一个日历。返回的 Calendar 基于当前时间,使用了默认时区和默认语言环境。
返回:一个 Calendar。
这是Calendar类的一个方法,这个类就是单例设计模式。通过getInstance()方法获取Calendar对象。
然后对比一下自己写的Person类,就明白了。一般写的Person类可以实例化很多对象p1、p2、p3、p4、p5......,但是Calendar没办法通过构造函数new出对象,只能使用getInstance()方法获得。
回复 使用道具 举报
我也因此困惑,看到大家的解释感觉清晰多了
回复 使用道具 举报
单例模式就是只创建一个对象,分懒汉和饿汉,饿汉是线程安全的,而懒汉是线程不安全
你这种是懒汉式,在是线程不安全的
回复 使用道具 举报
也因此困惑,看到大家的解释感觉清晰多了
回复 使用道具 举报
单例模式就是指类在内存中只能有一个对象。为了保证只在内存中有一个对象,就必须做如下的步骤:A:外界不能随意创建对象。所以把构造方法私有化,也就是被private修饰,这样外界就不能通过构造方法创建对象了。你的代码中private Single(){}就是在私有化构造方法。B:类本身要有一个对象。因为外界不能创建对象了,但是在内存中还必须有一个对象,所以类本身就自己创建了一个对象。你的代码中private static Single s = null;就是在创建对象。准确的说,现在还没创建对象,因为这是单例设计模式的懒汉式模式,只有在调用方法,发现s是null的时候才创建对象。这里为什么要加static呢,因为你下面的getInstance()方法是静态的,静态方法只能访问静态变量,所以加了静态。C:通过公共的方式提供给别人。因为外界不能创建对象,是类自己创建的,那么必须提供给外界才能被使用。你的代码中的getInstance()方法就是提供的公共方式。这里还需要解释一下,为什么这个公共方法也要加静态。因为方法只能被对象调用,或者直接被类名调用。这里外界是不能创建对象的,所以不能通过对象调用getInstance()方法了,只能通过类名调用了,而静态方法才可以直接通过类名调用,所以这个方法也就加了静态。
回复 使用道具 举报
单例模式,简单的理解就是只有一个。
为什么需要这种模式?
开发中,我们的软件可能会有一些文件用来保存用户的软件设置。
这些设置通常需要保存,而且不能又多个,因为如果有多个文件涉及到了设置,那么在软件运行,软件将无法分辨到底使用哪一种设置。所以这是单例模式的实际意义。
再说一下是如何保证唯一性?
通过构造函数你可以知道,这个类无法通过new()来创造对象。
只能通过静态方法来返回一个对象引用。而且返回的对象引用是方法提供的,而方法通过if()创建了唯一的一个对象,所以返回的对象引用始终都是方法中创建的那一个。
通过这种方式保证了对象的唯一性。
返回来的是引用,也是我们能使用的,但是因为对象是唯一的,而引用永远指向唯一的对象,所以,不管如何操作都是使用的同一个对象。
回复 使用道具 举报
吧无参构造私有了以后提供了公共的获取方法 这就保证了唯一性  不能通过该类常见对象了 获取到的对象都是一样的 不过这种单例模式不安全  听听老毕的视频讲的很清楚
回复 使用道具 举报
毕老师有讲,恶汉和懒汉那一块,对外提供创建对象的方法,将自己内部进行封装。
回复 使用道具 举报
南无ice 发表于 2016-1-5 22:15
毕老师有讲,恶汉和懒汉那一块,对外提供创建对象的方法,将自己内部进行封装。 ...

嗯,我也看那里了,先记下有这么个单例模式,虽说暂时用不到,但今后说不定要用
回复 使用道具 举报
放养的饼干 发表于 2016-1-5 22:30
嗯,我也看那里了,先记下有这么个单例模式,虽说暂时用不到,但今后说不定要用 ...

还真是呢,我今天看到多线程下的单例模式,正好是懒汉式中的问题。  还好提前看了下你的巩固了下。没至于脱节。。
回复 使用道具 举报
南无ice 发表于 2016-1-5 22:59
还真是呢,我今天看到多线程下的单例模式,正好是懒汉式中的问题。  还好提前看了下你的巩固了下。没至于 ...

加油!貌似最近的基础教学里不讲单例了,估计是上到改用的时候才讲
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马