看毕老师的视频看到单例设计模式,有个问题图片里是老师的 可是为什么不像下面这样写啊 不是更简单吗 有什
看毕老师的视频看到单例设计模式,有个问题
图片里是老师的
可是为什么不像下面这样写啊 不是更简单吗 有什么不同吗?
图片里是老师的
可是为什么不像下面这样写啊 不是更简单吗 有什么不同吗?
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()用来对这个成员变量赋值。**如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,就象一个人的身高,不能被外部随意修改,只能通过各种摄取营养的方法去修改这个属性。
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;
}
}