二者最主要的区别在于创建对象的时机不同: 饿汉模式是在类加载时就创建了对象实例,而懒汉模式是在使用时才创建(也就是调用获取实例对象方法时才创建) 饿汉模式不存在线程安全问题,懒汉模式存在线程安全问题 饿汉模式存在浪费资源的可能. 在我们javaSE标准类中,java.lang.Runtime就是经典的单例模式
public class SingleTon01 {
public static void main(String[] args) {
GirlFriend gf1 = GirlFriend.getGf();
GirlFriend gf2 = GirlFriend.getGf();
//true
System.out.println(gf1 == gf2);
Cat cat1 = Cat.getCat();
Cat cat2 = Cat.getCat();
//true
System.out.println(cat1 == cat2);
}
}
/**
* 单例模式-饿汉模式
* 在类加载的时候就会创建对象
*/
class GirlFriend {
public String name;
private static GirlFriend gf = new GirlFriend("小红");
public static GirlFriend getGf() {
return gf;
}
/**
* 构造器私有化,不能在本类之外new
* @param name
*/
private GirlFriend(String name) {
this.name = name;
}
@Override
public String toString() {
return "GirlFriend{" +
"name=" + name + +
};
}
}
/**
* 单例模式-懒汉模式
* 1.构造器私有化
* 2.提供一个static静态属性对象
* 3.提供一个public的static方法,返回一个实例对象
* 4.懒汉模式,只有在用户调用方法时,才会创建对象,之后再次调用,返回的是同一对象
*/
class Cat {
private String name;
private static Cat cat;
private Cat(String name) {
this.name = name;
}
public static Cat getCat() {
if (cat == null) {
cat = new Cat("加菲猫");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name=" + name + +
};
}
}