1. 饿汉式
1) 步骤实现
① 构造器私有化,防止直接new
② 类的内部创建对象
③ 向外暴露一个静态的公共方法
2) 代码实现
public class SingleTon01 {
public static void main(String[] args) {
//饿汉式单例模式创建
//此时获取两次公共方法,仍为同一个对象
GirlFriend xh = GirlFriend.getInstance();
GirlFriend xh1 = GirlFriend.getInstance();
System.out.println(GirlFriend.n1);
System.out.println(xh);
System.out.println(xh1);
System.out.println(xh == xh1); // 返回ture;验证是否为同一对象
}
}
class GirlFriend {
private String name;
public static int n1 =100;
//构造器私有化
private GirlFriend(String name) {
System.out.println("构造器被调用");
this.name = name;
}
//类的内部创建对象
private static GirlFriend gf = new GirlFriend("小红");
//向外暴露公共的静态方法
public static GirlFriend getInstance() {
return gf;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
3) 饿汉式说明
① 饿汉式在类加载的时候就创建了对象实例
② 饿汉式会造成资源浪费问题,如果我们一个创建的实例都没有使用,会造成资源的浪费
③ 饿汉式不会存在线程安全问题
例:
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 GirlFriend(String name) {
System.out.println("被调用");
this.name = name;
}
private static GirlFriend gf = new GirlFriend("小红");
public static GirlFriend getInstance() {
return gf;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
这里调用静态属性,并没有使用实例,但是对象就已经创建,因此会造成资源浪费。
2. 懒汉式
1)懒汉式与饿汉式步骤略有不同
① 构造器私有化,防止直接new
② 在类中定义一个实例
③ 在方法中创建对象,创建对象前做一个判断
public class SingleTon01 {
public static void main(String[] args) {
//如果只是调用静态属性,不使用实例,实例不会被创建
System.out.println(GirlFriend.n1);
//这儿重复使用,仍为同一实例
GirlFriend xh = GirlFriend.getInstance();
GirlFriend xh1 = GirlFriend.getInstance();
System.out.println(xh);
System.out.println(xh1);
System.out.println(xh == xh1);
}
}
class GirlFriend {
private String name;
public static int n1 =100;
//先定义一个实例对象
private static GirlFriend gf;
private GirlFriend(String name) {
System.out.println("被调用");
this.name = name;
}
public static GirlFriend getInstance() {
if (gf == null)
gf = new GirlFriend("小红");
return gf;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
2)懒汉式说明
① 懒汉式只在使用对象或实例时才会创建对象,不会造成资源的浪费
② 懒汉式会存在线程安全的问题