单例模式分为懒汉模式和饿汉模式
区别:
- 懒汉模式为在需要实例对象时创建唯一实例,在类加载时较快,运行时较慢,线程不安全
- 饿汉模式为在类加载时就创建唯一实例,加载较慢,运行速度快,线程安全
懒汉模式:
饿汉模式:package com.single; /** * 懒汉模式 * */ public class Singleton2 { //1.将构造方法私有化 private private Singleton2() { } //2.创建唯一一个实例的引用 private static private static Singleton2 instance; //3.封装一个方法,获得该唯一实例public static public static Singleton2 getSingleton2() { //判断实例是否已经创建 if(instance==null) { instance=new Singleton2(); } return instance; } }
测试:package com.single; /** * 饿汉模式 * */ public class Singleton { //1.将构造方法私有private private Singleton() { } //2.创建唯一一个实例,private static private static Singleton instance=new Singleton(); //3.封装一个方法,public static public static Singleton getSingleton() { return instance;//返回唯一实例的引用 } }
测试结果:package com.single; /** * 单例模式 * 1:懒汉模式,在需要实例对象时,创建惟一一个实例,类加载较快,运行速度慢,线程不安全 * 2:饿汉模式,在类加载时创建唯一实例,类加载较慢,运行速度快,线程安全 * */ public class Test { public static void main(String[] args) { Singleton s1=Singleton.getSingleton(); Singleton s2=Singleton.getSingleton(); if(s1==s2) { System.out.println("s1和s2是同一个实例对象"); }else { System.out.println("s1和s2不是同一个实例对象"); } Singleton2 s3=Singleton2.getSingleton2(); Singleton2 s4=Singleton2.getSingleton2(); if(s3==s4) { System.out.println("s3和s4是同一个实例对象"); }else { System.out.println("s3和s4不是同一个实例对象"); } } }
s1和s2是同一个实例对象
s3和s4是同一个实例对象