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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 北冥有鱼 中级黑马   /  2014-3-7 03:14  /  1049 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

都说单例设计模式除非使用暴力映射否则只能建立一个对象。于是胡乱改改,请问一下给单例设计模式添加了构造参数,是不是就不算是单例设计模式了
  1. class  Single
  2. {
  3.         int num;
  4.         private static Single s=null;
  5.         private Single(int num){
  6.                 this.num=num;
  7.         }
  8.         public static Single getInstance(int num)
  9.         {
  10.                 //while(s==null)
  11.                 //{
  12.                         //synchronized(Single.class)//单例设计模式———懒汉式加锁
  13.                         //{
  14.                                 s=new Single(num);
  15.                         //}
  16.                 //}
  17.                
  18.                 return s;
  19.         }
  20.        
  21. }
  22. class SingleDemo
  23. {
  24.         public static void main(String[] args)
  25.         {
  26.                 Single s1=Single.getInstance(1);
  27.                 Single s2=Single.getInstance(2);
  28.                 System.out.println("s1="+s1.num);
  29.                 System.out.println("s2="+s2.num);
  30.                 System.out.println("s1="+s1.num);
  31.         }
  32. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

4 个回复

倒序浏览
  1. class  Single
  2. {
  3.         int num;
  4.         private static Single s = null;
  5.         private Single(int num){
  6.                 this.num = num;
  7.         }
  8.         public static Single getInstance(int num)
  9.         {
  10.             while(s==null){//这行代码必须要加上才能实现单例
  11.                 s=new Single(num);
  12.               }
  13.             return s;
  14.         }
  15. }
  16. public class SingleDemo
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                 Single s1=Single.getInstance(1);
  21.                 Single s2=Single.getInstance(2);
  22.                                 System.out.println(s1==s2);//true,说明是同一个对象,还是单例设计模式
  23.                                 System.out.println("s1="+s1.num);//1
  24.                 System.out.println("s2="+s2.num);//1
  25.                 System.out.println("s1="+s1.num);//1
  26.         }
  27. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报

不加上也能实现单例,看毕老师的视频单例有两种方式,你说的这个是懒汉式单例,其实单例模式分为三种:懒汉式单例、饿汉式单例、登记式单例三种。你添加构造函数还是单例设计模式。  单例模式有一下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。



评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
还是单例设计模式,因为不管是通过懒汉式还是饿汉式,当在main函数中调用getInstance(int num)时,内存中始终都只有一个对象,建立s1,s2只不过增加了指向该对象的引用,若是带参构造函数,则参数就是首次建立对象的参数,不会改变,要想改变,可以通过get和set方法实现。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
怎么叫给单例模式添加构造函数就不是单例了?单例模式的构造函数只是private 的而已,不容许外界new对象,但是提供创建实例方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马