你这个问题根本不管设计模式什么事,我们来谈谈封装的思想:封装就是将属性私有化,提供公有的方法访问私有的属性。*实现封装的步骤:(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; } }
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;
}}
不过楼主视频中的代码是“饿汉式单例”
还有一种“懒汉式单例”
而且楼主没有考虑到多线程。
http://blog.csdn.net/kiritor/article/details/8675215
看看我的解释不知符合楼主的口味不:
所谓的单利,就是项目中这能使用这一个类的实例。一般获取类的实例是通过一个public static修饰的方法来获取的。
一般类里的属性是private的,通过public的方法进行 赋值/获得值。所以楼主你写public方法操作private的a不错。
只不过 楼主你这样写static dingzi dz=new dingzi(); 不符合单例了, 你可以对dz重新赋值,那么这个类的实例就不是唯一的一个了,而是可以很多个了,那么这个类就不叫单例了。
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;
}
}
而第二个 你可以通过全局变量修改 就像我的代码中那样s可以为null 这就不是单例模式了。不过楼主既然明白了就ok了