黑马程序员技术交流社区
标题:
单例设计模式不好理解啊!帮帮忙
[打印本页]
作者:
创出一片辉煌
时间:
2012-8-2 22:07
标题:
单例设计模式不好理解啊!帮帮忙
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”的地址给这三个对象?
这三个对象在操作时之间会有什么联系或影响吗??,因为它们都是一个对象啊!
作者:
陈潼
时间:
2012-8-2 22:27
我用过单例,当时是一个音乐播放器。主要用途简单叙述如下:
当你不是用单例的时候就会造成多个音乐的同时播放。使用单例才能做让到音乐播放器在你点击播放时播放一首歌。
大体代码贴在下面 当时没有考虑多线程,所以单例设计不好,将就着看吧 莫笑…………呵呵
//使用单例类避免产生前后音乐叠加现象
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方法开始播一首歌,再调用换另一首歌
如果不是单例,当然可以用一个对象,但是这样不严谨,谁知道会不会有人使用的时候建个类呢?所以使用单例是最好的,别人使用不会出错。建立多个对象的后果就是多首音乐同时播放。
以上个人简介,还请批评指正
作者:
孙建飞
时间:
2012-8-2 22:28
单例设计模式就是只有一个实例。A类将自己的构造函数私有化后别的类将无法为其创建实例,但后A类自己创建一个实例,提供一个供其他类调用该实例的方法。
不知道这种单例设计的程序有什么意义?以上代码远不如直接实例化操作来的直接,为什么还要这样去做呢?
回答:举个例子,比如简单的登录功能。User登录后别的页面也需要user对象。而你只需要创建一个实例就可以,没必要每用一次就创建一个对象,这样浪费内存。
如果现在产生了本类的三个对象?这样是不是把“instance”的地址给这三个对象?
回答:很明显不是的,另外如果这个类中创建三个对象就没有意义了。因为单例模式只需要创建一个对象
这三个对象在操作时之间会有什么联系或影响吗??,因为它们都是一个对象啊!
回答:正如你说的那样:它们都是以个对象。不是三个对象。
作者:
陈潼
时间:
2012-8-2 22:29
忘了说了,一个实例改变,你得到的三个实例都会改变。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2