本帖最后由 u010062569 于 2013-03-28 00:21:47 编辑

解决方案 »

  1.   

    如果把全局變量暴露出來 那麼它的值會被改掉,像下面這樣,程序會拋出異常。 而第一種方法只能獲得實例而不能對其更改,這就是區別。相信如果你瞭解C#中的屬性和字段的區別 就能更好的瞭解自己的這個問題了
    class dingzi1
    {
    public static void main(String[] args)
    { dingzi.dz = null; dingzi d2 = dingzi.dz;

    d2.setA(2);

    }
    }class dingzi
    {
    private dingzi()
    {
    } private int a;

    static dingzi dz = new dingzi(); public void setA(int a)
    {
    this.a = a;
    } public int getA()
    {
    return a;
    }}
      

  2.   

    单例模式就是客户端始终拿到的是同一个实例,你的代码,客户端都可以修改实例了,因为你的是public的变量和public方法
      

  3.   

    楼上各位解释的差不多了,
    不过楼主视频中的代码是“饿汉式单例”
    还有一种“懒汉式单例”
    而且楼主没有考虑到多线程。
         http://blog.csdn.net/kiritor/article/details/8675215
      

  4.   

    我不懂你说的什么 单例模式本来就能修改实例,再说我没有public变量和public方法  你怎么会这么说?求解释 
      

  5.   

    你确定你楼上不是在胡说?我的public方法是对私有变量操作的 添加到上一个方法 也没错 只是我下面多写了个 我以为我学了1个月的菜鸟 不会搞混的东西 你们工作了几年了肯定没问题 我就没删。。结果还是说到这个上来了
      

  6.   

    楼主说的好给你!哈哈
    看看我的解释不知符合楼主的口味不:
    所谓的单利,就是项目中这能使用这一个类的实例。一般获取类的实例是通过一个public static修饰的方法来获取的。
    一般类里的属性是private的,通过public的方法进行 赋值/获得值。所以楼主你写public方法操作private的a不错。
    只不过 楼主你这样写static dingzi dz=new dingzi(); 不符合单例了, 你可以对dz重新赋值,那么这个类的实例就不是唯一的一个了,而是可以很多个了,那么这个类就不叫单例了。
      

  7.   

    你这个问题根本不管设计模式什么事,我们来谈谈封装的思想:封装就是将属性私有化,提供公有的方法访问私有的属性。*实现封装的步骤:(1)修改属性的可见性来限制对属性的访问。(2)为每个属性创建一对赋值方法和取值方法,用于对这些属性的访问。(3)在赋值和取值方法中,加入对属性的存取限制。**为了实现良好的封装性,我们通常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,一个是getXxx()(Xxx表示要访问的成员变量的名字),用来读取这个成员变量操作,另外一个是setXxx()用来对这个成员变量赋值。**如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,就象一个人的身高,不能被外部随意修改,只能通过各种摄取营养的方法去修改这个属性。
    public class AccpTeacher{    
    private String name;   
     private int age;   
     public String getName(){    
    return name;
    }    
    public void setName(String name){    
    this.name = name;
    }    
    public int getAge(){ 
       return name;
    }    
    public void setName(String age){ 
       if(age<22){  
          System.out.println("年龄不符合,太小!");
    }else{
    this.age = age;
    }
    }

    封装的优点:(1)隐藏类的实现细节;(2)让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制     逻辑,限制对属性的不合理操作;(3)便于修改,增强代码的可维护性;看我这个你应该明白为什么要将属性私有化。单例模式分为两种,还有一种变形:
    public class Single { private static Single single = null; private Single() {
    } public static Single getInstance() {
    if (single == null) {
    single = new Single();
    }
    return single;
    }
    }不过这些形式都会有线程同步问题,如果有两个线程A 和线程B同时访问,B在调用的时候A也在调用,该对象的属性随时有被修改的可能,会引起业务的混乱,也失去了单例的效果。而下面这种单例模式,假如现在有两个线程A 和线程B,线程A 执行到single = new Single(),正在申请内存分配,可能需要0.001 微秒,就在这0.001 微秒之内,线程B 执行到if(single == null),你说这个时候这个判断条件是true 还是false?是true,那然后呢?线程B 也往下走,于是乎就在内存中就有两个Single的实例了,看看是不是出问题了?
    简单的、彻底解决问题的方案:public class Single { private static final Single single = new Single(); private Single() {
    } public synchronized static Single getInstance() {
    return single;
    }
    }
      

  8.   

    第一个是不能改的,只能通过getInstance方法获得唯一的实例s
    而第二个 你可以通过全局变量修改 就像我的代码中那样s可以为null 这就不是单例模式了。不过楼主既然明白了就ok了