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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class Singleton{
private static Singleton instance = new Singleton() ; // 在内部产生本类的实例化对象
public static Singleton getInstance(){  // 通过静态方法取得instance对象
  return instance ;
}
private Singleton(){  // 将构造方法进行了封装,私有化
}
public void print(){
  System.out.println("Hello World!!!") ;
}
};
public class SingletonDemo05{
public static void main(String args[]){
  Singleton s1 = null ; // 声明对象
  s1 = Singleton.getInstance() ; // 取得实例化对象
  s1.print() ;  // 调用方法
}
};
不知道这种单例设计的程序有什么意义?以上代码远不如直接实例化操作来的直接,为什么还要这样去做呢?
如果现在产生了本类的三个对象?这样是不是把“instance”的地址给这三个对象?
这三个对象在操作时之间会有什么联系或影响吗??,因为它们都是一个对象啊!

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
我用过单例,当时是一个音乐播放器。主要用途简单叙述如下:
当你不是用单例的时候就会造成多个音乐的同时播放。使用单例才能做让到音乐播放器在你点击播放时播放一首歌。
大体代码贴在下面 当时没有考虑多线程,所以单例设计不好,将就着看吧 莫笑…………呵呵

//使用单例类避免产生前后音乐叠加现象
class Music
{
        private static Music instance;
        private Sequencer sequencer;
        //使用private,避免构造器被调用
        private Music() {}
        public  static Music getInstance()
        {
                if(instance == null)
                {
                        instance = new Music();
                }
                return instance;
        }
        void play(String name)
        {
                //第一次sequencer为null,之后可调用isRunning(),开始时未考虑到前者
                if(sequencer!=null&&sequencer.isRunning())
                {
                        sequencer.stop();
                }
                //下为必须执行的语句,不可放在else中……原先写错,导致第一次按时暂停,第二次按才能播放新歌曲
            try
            {
                   String MusicPath = "music\\"+name+".mid";
                   sequencer = MidiSystem.getSequencer();
                   sequencer.open();
                   File my = new File(MusicPath);
                   Sequence mySeq = MidiSystem.getSequence(my);
                   sequencer.setSequence(mySeq);
                   sequencer.start();
            }
            catch (Exception e)
            {
                        e.printStackTrace();
            }
         }
         //对外提供停止播放方法
         void stop()
         {
                 //此处也应注意sequencer为null,否则关闭按钮调用此方法时若未曾播放歌曲会报错
                 if(sequencer!=null)
                 {
                         sequencer.stop();
                 }
        }
}
如上面的代码,获得 Music类的实例后,调用play方法开始播一首歌,再调用换另一首歌
如果不是单例,当然可以用一个对象,但是这样不严谨,谁知道会不会有人使用的时候建个类呢?所以使用单例是最好的,别人使用不会出错。建立多个对象的后果就是多首音乐同时播放。
以上个人简介,还请批评指正

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

回复 使用道具 举报
单例设计模式就是只有一个实例。A类将自己的构造函数私有化后别的类将无法为其创建实例,但后A类自己创建一个实例,提供一个供其他类调用该实例的方法。
不知道这种单例设计的程序有什么意义?以上代码远不如直接实例化操作来的直接,为什么还要这样去做呢?
回答:举个例子,比如简单的登录功能。User登录后别的页面也需要user对象。而你只需要创建一个实例就可以,没必要每用一次就创建一个对象,这样浪费内存。
如果现在产生了本类的三个对象?这样是不是把“instance”的地址给这三个对象?
回答:很明显不是的,另外如果这个类中创建三个对象就没有意义了。因为单例模式只需要创建一个对象
这三个对象在操作时之间会有什么联系或影响吗??,因为它们都是一个对象啊!
回答:正如你说的那样:它们都是以个对象。不是三个对象。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

回复 使用道具 举报
忘了说了,一个实例改变,你得到的三个实例都会改变。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马