设计一个单例模式的类,JAVA中单例模式
00-1010注意优缺点使用场景一,实施模式二,实施模式三,测试总结
00-1010 1.单例类只能有一个实例。
2.singleton类必须创建自己唯一的实例。
3.singleton类必须向所有其他对象提供这个实例。
00-1010 1.内存只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院的主页缓存)。
2.避免多次占用资源(比如写文件)。
00-1010 1.没有接口,不能继承,与单一职责原则冲突。一个类应该只关心内部逻辑,而不关心如何在外部实例化它。
00-1010 1.需要产生一个唯一的序列号。
2.2中的计数器。WEB不需要在每次刷新时都添加到数据库中,所以可以先用单个实例缓存它们。
3.创建一个对象需要消耗太多的资源,比如I/O和数据库的连接。
目录
包com . asur plus.common . singleton . style 1;导入lombok . extern . SLF 4j . SLF 4j;导入Java . util . objects;@ SLF 4j public class resu tils { private volatile static resu tils instance=null;/* * * Private construction method */Private Results(){ }/* *提供了在实例为空时获取实例的方法* * @ return */public static Results GetInstance(){//Create if(objects . is null(instance))。{//synchronized(results . class)为空时避免创建if(objects . is null(instance)){//Create a new object instance=new results();Log.info(对象已创建);} } }返回实例;}}我们将它的构造方法私有化,让外部无法创建实例,我们提供了获取唯一实例的方法,让我们可以从外部获取。
注意
包com . asur plus.common . singleton . style 2;导入lombok . extern . SLF 4j . SLF 4j;@ slf4jpublicclassresutils2 {/* *静态内部类*/private static class resu tils 2 holder { private static resu tils 2 instance=newresu tils 2();}/* * *提供获取实例的方法* * @ return */public static resu tils 2 getinstance(){ return resu tils 2 holder . instance;}}我们使用静态内部类的方法创建一个实例。由于JVM只加载一次的原则,最后只会创建一个实例,并提供了获取实例的方法,这样我们就可以从外部获取了。
优点
包com . asur plus.common . singleton;导入com . asur plus.common . singleton . style 1 . resu tils;导入Java . util . concurrent . executorservice;导入Java . util . concurrent . executors;/* * * singleton pattern */public class test main { public static void main(string[]args){//创建线程池executorservice executorservice=executors . newfixedthreadpool(10);for(int I=0;i 100I){ executorservice . execute(resutils 3360: getinstance);} executorservice . shut down();} }输出结果
可以看到,我们获得了100个实例,只创建了一个实例,从而实现了我们的singleton模式。
缺点
本文到此为止。希望它能帮到你,也希望你能多关注更多的盛行它的内容!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。