通过百度百科我们了解到,单例模式的定义如下:
“保证一个类仅有一个实例,并提供一个访问它的全局访问点。
这是定义,那么我的理解就是,解决一个类在内存只存在一个对象。其他的类在访问的他的时候,只用这一个对象,也就是我们规定了这个对象,用户只可以在这一块内存空间上使用。
为了创建单例模式,就要保证对象的唯一。
- 为了避免其他类过多的建立该类的对象,先禁止程序建立该类对象
- 为了让其他程序访问该类对象,只好在本类中建立一个自定义对象。
- 为了方便其他类对自定义对象的访问,可以对外提供一些访问方式。
- 将构造函数私有化
- 在类中创建一个本类对象
- 提供一个方法可以获得该对象
写一个例子说明
public class SingleDemo {
/**LGL
* @param args
*/
public static class Single {
private Single() {}//1、将构造函数私有化
private int x;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
private static Single s = new Single();//2、在类中创建一个本类对象
public static Single getInstance(){//3、提供一个方法可以获得该对象
return s;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Single s1=Single.getInstance();
Single s2=Single.getInstance();
s1.setX(15);//设置s1对象的x
System.out.println(s2.getX());//这里打印s2对象的x的值,因为s1里的x值肯定是15,我们打印s2里的x,如果也是15,则证明s1和s2是一个对象,引用同一块内存
System.out.println(s2==s1);//如果为true则证明s1、s2是同一块内存,同一个对象
}
}
//打印结果
15
true
以上 方式的单例模式称为
饿汗式
下面 介绍的方法叫
懒汉式
public class SingleDemo2 {
/**LGL 懒汉式 单例模式的写法
* @param args
*/
public static class Single {
private static Single s=null;
private Single() {}//1、将构造函数私有化
public static Single getInstance(){//3、提供一个方法可以获得该对象
if (s==null) {//利用双判断+同步锁 的方式 保证对象的唯一性
synchronized (Single.class) {
if (s==null) {
s=new Single();
}
}
}
return s;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Single s1=Single.getInstance();
Single s2=Single.getInstance();
System.out.println(s2==s1);//如果为true则证明s1、s2是同一块内存,同一个对象
}
}
// 打印结果
true