黑马程序员技术交流社区

标题: 单例设计模式的问题 [打印本页]

作者: wodeairenw    时间: 2013-4-22 23:53
标题: 单例设计模式的问题
本帖最后由 wodeairenw 于 2013-4-23 01:26 编辑

public class NumberMachine
{
        private NumberMachine(){}
        private static NumberMachine instance = new NumberMachine();
        public static NumberMachine getInstance()        
        {
                return instance;
        }//将对象变成单列模式

        private NumberManager commonManager = new NumberManager();//普通客户号码管理器
        private NumberManager expressManager = new NumberManager();//快速客户号码管理器
        private NumberManager vipManager = new NumberManager();//VIP客户号码管理器
        public NumberManager getCommonManager()
        {
                return commonManager;
        }
        public NumberManager getExpressManager()
        {
                return expressManager;
        }
        public NumberManager getVipManager()
        {
                return vipManager;
        }
        
}
import java.util.ArrayList;
import java.util.List;
public class NumberManager
{
       private int lastNumber = 0;//上次返回的号码
       private List<Integer> queueNumbers = new ArrayList<Integer>();//存储排队的号码
       public synchronized Integer generateNewNumber()//客户产生
       {
             queueNumbers.add(++lastNumber);//将产生的号码存储到队列里面
              return lastNumber;
        }
        public synchronized Integer fetchNumber()//窗口取号方法
        {
                if(queueNumbers.size()>0)//防止数组角标越界异常
               {
                      return queueNumbers.remove(0);
               }
                else
               {
                        return null;
               }
       }
}
单例里面定义了返回对象的方法,这些返回的对象还是同一个对象么?
如果每次都创建不同的对象,那里面的lastNumber不是每次都初始化,那存储到List集合里面就没有意义,这个是银行调度系统代码,运行的结果是集合里面是有序的,所以应该是一个对象。懂的分析下原理。
作者: 杨同旺    时间: 2013-4-23 00:44
本帖最后由 杨同旺 于 2013-4-23 00:49 编辑

单例,指的是总是返回同一个对象.

以上的代码,返回的NumberManager对象,是不同的对象.


作者: wodeairenw    时间: 2013-4-23 01:24
杨同旺 发表于 2013-4-23 00:44
单例,指的是总是返回同一个对象.

以上的代码,返回的NumberManager对象,是不同的对象.

我把完整的代码发上来了,如果每次都创建不同的对象,那里面的lastNumber不是每次都初始化,那存储就没有意义,所以应该是一个对象。懂的分析下原理。
作者: harborbest    时间: 2013-4-25 08:47
本帖最后由 harborbest 于 2013-4-25 11:11 编辑

单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
  1. public class TestStream {
  2. private String name;
  3. public String getName() {
  4. return name;
  5. }
  6. public void setName(String name) {
  7. this.name = name;
  8. }
  9. //该类只能有一个实例
  10. private TestStream(){} //私有无参构造方法
  11. //该类必须自行创建
  12. //有2种方式
  13. /*private static final TestStream ts=new TestStream();*/
  14. private static TestStream ts1=null;
  15. //这个类必须自动向整个系统提供这个实例对象
  16. public static TestStream getTest(){
  17. if(ts1==null){
  18. ts1=new TestStream();
  19. }
  20. return ts1;
  21. }
  22. public void getInfo(){
  23. System.out.println("output message "+name);
  24. }
  25. }
  26. -----------------------------------------------------------------------------------------
  27. public class TestMain {
  28.      public static void main(String [] args){
  29.          TestStream s=TestStream.getTest();
  30.          s.setName("张三");
  31.          System.out.println(s.getName());
  32.          TestStream s1=TestStream.getTest();
  33.          s1.setName("张三");
  34.          System.out.println(s1.getName());
  35.          s.getInfo();
  36.          s1.getInfo();
  37.          if(s==s1){
  38.              System.out.println("创建的是同一个实例");
  39.          }else if(s!=s1){
  40.              System.out.println("创建的不是同一个实例");
  41.          }else{
  42.              System.out.println("application error");
  43.          }
  44.      }
  45. }
复制代码
运行结果:
  张三
  张三
  output message 张三
  output message 张三
  创建的是同一个实例
结论:由结果可以得知单例模式为一个面向对象的应用程序提供了对象惟一的访问点,不管它实现何种功能,整个应用程序都会同享一个单例对象.

作者: 袁梦希    时间: 2013-4-25 08:52
版主拎包郑重提示:{:soso_e102:}如果楼主问题已经解决那么。在自己发表的帖子下面,点“修改”,
然后把主题的分类标记成“已解决”。就OK了


作者: 黄玉昆    时间: 2013-4-25 13:56
袁梦希 发表于 2013-4-25 08:52
版主拎包郑重提示:如果楼主问题已经解决那么。在自己发表的帖子下面,点“修改”,
然后把主 ...

额,你再让我们版主拎包,我们就没得拎了。谢谢你啊,还是我们自己拎包吧。:lol




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