目录
概念:
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只存在一个对象实例,并且该类只提供一个取得其对象实例的方法
步骤:
(1)构造器私有化(防止直接new)
(2)类的内部创建对象
(3)向外暴露一个静态的公共方法
分类:
1.饿汉式
代码实现:
public class SingleTon01 {
public static void main(String[] args) {
System.out.println(GirlFriend.n1);
}
}
class GirlFriend {
private String name;
public static int n1 = 100;
private static GirlFriend gf = new GirlFriend("小红红");//提前创建
private GirlFriend(String name) {
this.name = name;
}
public static GirlFriend getInstance() {
return gf;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
2.懒汉式(简化)
public class SingleTon02 {
public static void main(String[] args) {
Cat instance1 = Cat.getInstance();
Cat instance2 = Cat.getInstance();
System.out.println(instance1 == instance2);//true
}
}
class Cat {
private String name;
private static Cat cat;//这里没有new
public static int n1 = 100;
private Cat(String name) {
System.out.println("构造器被调用...");
this.name = name;
}
public static Cat getInstance() {
if (cat == null) {//如果还没有创建cat对象
cat = new Cat("小可爱");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}
对比:
1.二者最主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用才创建
2.饿汉式不存在线程安全问题,懒汉式存在线程安全问题(暂时没有解决线程安全问题)。
3.饿汉式存在资源的可能。因为如果一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式就是使用时才创建,就不存在这个问题。
jdk源码中java.lang.Runtime类使用了单例模式