设计模式
✍️
更新中
单例模式
采取一定方法,确保某类整个软件系统中只有一个对象实例,且只有一种方法取得生成的实例。
饿汉式
步骤
- 将构造器设为私有(无法 new
- 在类内部创建实例
- 使用静态公共方法暴露实例
java
public class SingleInstance01 {
public static void main(String[] args) {
GirlFriend.getGirlFriend();
}
}
class GirlFriend{
private String name;
private int age;
private static GirlFriend girlFriend = new GirlFriend("lapp",21);// 随着类的加载初始化,且只会执行一次
private GirlFriend(String name,int age){
System.out.println(name+"我老婆");
this.age = age;
this.name = name;
}
// 静态方法,不用创建对象调用方法
public static GirlFriend getGirlFriend(){
// GirlFriend girlFriend = new GirlFriend("lapp",21); 这样做无法保证生成唯一一个实例
return girlFriend;
}
}
懒汉式
创建了对象但是没有用会造成资源浪费。单例模式中的懒汉式解决了这一问题,使用到实例才会创建。
更改:
java
class GirlFriend{
private String name;
private int age;
private static GirlFriend girlFriend;
private GirlFriend(String name,int age){
System.out.println(name+"我老婆");
this.age = age;
this.name = name;
}
// 静态方法,不用创建对象调用方法
public static GirlFriend getGirlFriend(){
if( girlFriend== null){
girlFriend = new GirlFriend("lapp",21);
}
return girlFriend;
}
}
只有调用 getGirlFriend()方法的时候才会创建实例。再次调用时返回第一次调用的 GirlFriend 对象,不会重新生成。
对比
饿汉与懒汉的不同在于创建对象的时机不同
饿汉模式在类加载时就创建了对象,懒汉模式在用户使用的时候才会创建
饿汉式不存在线程安全问题,懒汉式存在线程安全风险,可能创建多个对象
饿汉式可能造成空间的浪费
JavaSE 标准类中,java.lang.Runtime 是经典的单例模式