日期:2014-05-20  浏览次数:20771 次

看毕老师的视频看到单例设计模式,有个问题
本帖最后由 u010062569 于 2013-03-28 00:21:47 编辑

图片里是老师的 
可是为什么不像下面这样写啊 不是更简单吗 有什么不同吗?
 class  dingzi1
{
public static void main(String[] args) 
{

dingzi.dz.setA(111);
System.out.println(dingzi.dz.getA());
}
}
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;
}

}

------解决方案--------------------
如果把全局變量暴露出來 那麼它的值會被改掉,像下面這樣,程序會拋出異常。 而第一種方法只能獲得實例而不能對其更改,這就是區別。相信如果你瞭解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;
}

}

------解决方案--------------------
单例模式就是客户端始终拿到的是同一个实例,你的代码,客户端都可以修改实例了,因为你的是public的变量和public方法
------解决方案--------------------
楼上解释不错
我来接个分
------解决方案--------------------
引用:

图片里是老师的 
可是为什么不像下面这样写啊 不是更简单吗 有什么不同吗?
 class  dingzi1
{
public static void main(String[] args) 
{

dingzi.dz.setA(111);
System.out.println(dingzi.dz.getA());
}
}
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;
}

}

楼上各位解释的差不多了,
不过楼主视频中的代码是“饿汉式单例”
还有一种“懒汉式单例”
而且楼主没有考虑到多线程。
     http://blog.csdn.net/kiritor/article/details/8675215
------解决方案--------------------
这个程序不只是构造一个对象的问题吧,如果把“111”改成“222”此对象内容就改变了,你的方法是共有的。。。。。
------解决方案--------------------
楼主说的好给你!哈哈
看看我的解释不知符合楼主的口味不:
所谓的单利,就是项目中这能使用这一个类的实例。一般获取类的实例是通过一个public static修饰的方法来获取的。
一般类里的属性是private的,通过public的方法进行 赋值/获得值。所以楼主你写public方法操作private的a不错。
只不过 楼主你这样写static dingzi dz=new dingzi(); 不符合单例了, 你可以对dz重新赋值,那么这个类的实例就不是唯一的一个了,而是可以很多个了,那么这个类就不叫单例了。


------解决方案--------------------
上面的单例在并发线程很高的也没问题,自己写的容易修改你的值!
------解决方案--------------------
你这个问题根本不管设计模式什么事,我们来谈谈封装的思想:封装就是将属性私有化,提供公有的方法访问私有的属性。*实现封装的步骤:(1)修改属性的可见性来限制对属性的访问。(2)为每个属性创建一对赋值方法和取值方法,用于对这些属性的访问。(3)在赋值和取值方法中,加入对属性的存取限制。**为了实现良好的封装性,我们通常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,一个是getXxx()(Xxx表示要访问的成员变量的名字),用来读取这个成员变量操作,另外一个是setXxx()用来对这个成员变量赋值。**如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,就象一个人的身高,不能被外部随意修改,只能通过各种摄取营养的方法去修改这个属性。