- 设计思想:保证创建的对象只能实例化一次。
- 设计方法:把类的构造方法私有化,并创建该类的私有对象为成员属性,在通过静态方法返回该对象的一个实例。
3.下面通过一个简单的代码做说明单例模式的懒汉式和饿汉试
懒汉式
package cn.jse.danli;
public class Singletion {
private Singletion() {
//私有构造方法,其他类不能通过new来创建该类对象
}
private static final Singletion singletion = new Singletion();//懒汉试,类加载时就创建该对象
/**
*通过静态方法获取该类对象
*/
public static Singletion getSingletion() {
return singletion;
}
}
饿汉试
package cn.jse.danli;
public class Singletion2 {
private static Singletion2 singletion2=null;//饿汉式,使用时再创建该类对象
private Singletion2() {
}
//这里要加同步锁,防止并发可能引起的错误
public synchronized static Singletion2 getSingletion2() {
if(singletion2==null) {
singletion2 = new Singletion2();
return singletion2;
}
return singletion2;
}
}
下面来测试一下
package cn.jse.danli;
public class Test {
/**
*
* 一个类只能创建一个实例,每个类都通过get***()来获取两个实例,
* 在比较一下,看看输出结果
*/
public static void main(String[] args) {
Singletion singletion1 = Singletion.getSingletion();
Singletion singletion2 = Singletion.getSingletion();
System.out.println(singletion1==singletion2);
System.out.println(singletion1);
System.out.println(singletion2);
System.out.println("-------------------");
Singletion2 singletion21 = Singletion2.getSingletion2();
Singletion2 singletion22 = Singletion2.getSingletion2();
System.out.println(singletion21==singletion22);
System.out.println(singletion21);
System.out.println(singletion22);
}
}
运行结果
true
cn.jse.danli.Singletion@52e922
cn.jse.danli.Singletion@52e922
true
cn.jse.danli.Singletion2@25154f
cn.jse.danli.Singletion2@25154f
可见获得的是同一个对象。这就是单例模式,属于创建型模式,很简单。但有什么用呢?
以上是我学习时的理解,有不对的地方,请大家指正,斧正,锤子正。