定义单例设计模式就是采取一定的方法保证在整个软件系统中,某个类只能有一个对象实例,这个类只提供一次访问其对象实例的方法(静态方法)。使用场景针对需要频繁创建和销毁的重量级对象,对象工具,对象数据源,session单例模式,八个方法,饿了么中国式(静态常量)/***饿了么中国式(静态常量)*优点:简单,避免多线程同步问题*缺点:没有延迟加载,内存浪费*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/publicclassSingleton1{//private构造方法privateSingleton1(){}//静态常量privatestaticfinalSingleton1singleton1=newSingleton1();//提供公共方法publicstaticSingleton1getSingleton1(){returnsingleton1;}}分析优点:简单,避免多线程同步问题。缺点:没有懒加载,内存浪费。饿了么中国式(静态代码块)/***饿了么中国式(静态代码块)*优点:简单,避免多线程同步问题*缺点:不能懒加载,内存浪费*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/publicclassSingleton2{//私有构造方法privateSingleton2(){}privatestaticfinalSingleton2singleton2;//静态代码块static{singleton2=newSingleton2();}//对外提供一个公共方法publicstaticSingleton2getSingleton2(){returnsingleton2;}}分析优点:简单,避免多线程同步问题。缺点:没有懒加载,内存浪费。懒人风格(线程不安全)/***懒人风格(线程不安全)*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/publicclassSingleton3{//私有化构造方法privateSingleton3(){}//内部属性privatestaticSingleton3singleton3;//公共方法publicstaticSingleton3getSingletons(){if(singleton3==null){singleton3=newSingleton3();}返回单例3;}}分析优点:具有懒加载的效果,不会造成内存浪费。缺点:线程不安全,不推荐这种方式。Lazystyle(synchronizationmethod)/***Lazystyle(synchronizationmethod)*优点:解决线程同步问题*缺点:使用synchronized同步关键字,性能太低*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/publicclassSingleton4{//私有构造方法privateSingleton4(){}//内部属性privatestaticSingleton4singleton4;//公共方法publicstaticsynchronizedSingleton4getSingleton4(){if(singleton4==null){singleton4=newSingleton4();}返回singleton4;}}分析优点:解决线程安全问题。缺点:效率太低。懒人风格(同步代码块)/***懒人风格(同步代码块)*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/publicclassSingleton5{//私有化构建methodprivateSingleton5(){}//内部属性privatestaticSingleton5singleton5;//公共方法publicstaticSingleton5getSingleton5(){if(singleton5==null){synchronized(Singleton5.class){singleton5=newSingleton5();}}返回singleton5;}}分析优点:具有懒加载的效果,不会造成内存浪费。缺点:线程不安全,不推荐这种方式。复查锁模式/***复查锁机制*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/publicclassSingleton6{//私有构造方法privateSingleton6(){}//内部属性privatevolatilestaticSingleton6singleton6;//公共方法publicstaticSingleton6getSingleton6(){if(singleton6==null){synchronized(Singleton6.class){if(singleton6==null){singleton6=newSingleton6();}}}返回singleton6;}}解析实现了延迟加载,效率高,解决了线程安全。静态内部类模式/***静态内部类*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/publicclassSingleton7{//私有构造方法privateSingleton7(){}//内部类privatestaticclassSingleInstance{publicstaticfinalSingleton7singleton7=newSingleton7();}//对外提供公共方法publicstaticSingleton7getSingleton7(){returnSingleInstance.singleton7;帮助我们确保线程安全。利用静态内部类的特点,效率也很高。推荐在实际开发中使用。枚举方式定义单例对象/***@desc:*@author:liyajie*@createTime:2022/2/1110:25*@version:1.0*/publicclassSingleton{publicvoidhello(){System.out.println("你好");}}定义枚举来实例化单例对象/***枚举方法*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/enumSingleton8{//相当于publicstaticfinalSingleton8INSTANCE;//保证枚举实例只能被实例化一次INSTANCE;//定义单例变量privateSingletonsingleton;//枚举构造方法,构造方法是私有的,在执行构造方法的时候,同时创建我们的单例对象Singleton8(){singleton=newSingleton();}//提供公共方法publicSingletongetSingleton(){returnsingleton;}}使用方法Singleton8.INSTANCE.getSingleton()来获取我们的单例对象。分析简单,避免了线程安全问题。推荐在实际开发中使用。总结单例模式保证了系统内存中只有一个该类的对象,节省了系统资源。对于一些需要频繁创建和销毁的对象,使用单例模式可以提高系统性能。当你要实例化一个单例类时,一定要记得使用相应的获取对象的方法,而不是使用new。单例模式推荐的方法包括内部静态类方法和枚举方法。
