【设计模式】-- 单例模式

单例模式Singleton

  • 应用场合:有些对象只需要一个就足够了,如古代的皇帝、老婆
  • 作用:保证整个应用程序中某个实例有且只有一个
  • 类型:饿汉式、懒汉式

下定义,什么是饿汉懒汉式?

  • 饿汉模式:只要类一加载,它就开始初始化,永远都是没有吃饱,所以叫饿汉式
  • 懒汉模式:当类加载的时候,比并没有初始化实例,而是在用户获取的时候才初始化,所以叫 懒汉式

区别

  • 饿汉模式,类的加载比较慢,但是运行获取对象的速度比较快,线程是安全的
  • 懒汉模式,类的加载比较快,但是运行获取对象的速度比较慢,线程不安全

饿汉式

//饿汉模式
public class EagerSingleton {
    
    //1、将构造方法私有化,不允许外部直接创建对象
    private EagerSingleton() {
        
    }
    
    //2、创建类的唯一实例,使用private static变成为类的静态成员
    private static EagerSingleton instance = new EagerSingleton();
    
    //3、提供一个获取实例的方法,使用public static修饰
    public static EagerSingleton getInstance(){
        
        return instance;
    }

}

懒汉式

//懒汉模式
public class LazySingleton {
    
    //1、将构造方法私有化,不允许外部直接创建对象
    private LazySingleton() {
        
    }
    
    //2、创建类的唯一实例,使用private static变成为类的静态成员
    private static LazySingleton instance;
    
    //3、提供一个获取实例的方法,使用public static修饰
    public static LazySingleton getInstance(){
        
        if(instance == null){
            instance = new LazySingleton();
        }
        
        return instance;
    }

}

测试

//测试
public class TestSingleton {
    
    public static void main(String[] args) {
        
        //饿汉式
        EagerSingleton s1 = EagerSingleton.getInstance();
        EagerSingleton s2 = EagerSingleton.getInstance();
        
        if (s1 == s2) {
            System.out.println("s1和s2是同一个实例");
        }else{
            System.out.println("s1和s2不是同一个实例");
        }
        
        //懒汉式
        LazySingleton s3 = LazySingleton.getInstance();
        LazySingleton s4 = LazySingleton.getInstance();
        
        if (s3 == s4) {
            System.out.println("s3和s4是同一个实例");
        }else{
            System.out.println("s3和s4不是同一个实例");
        }
    }

}

输出结果

s1和s2是同一个实例
s3和s4是同一个实例

你可能感兴趣的:(【设计模式】-- 单例模式)