设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例
创始人
2024-04-01 02:35:11
0

场景

设计模式-单例模式-饿汉式单例模式、懒汉式单例模式、静态内部类在Java中的使用示例:

设计模式-单例模式-饿汉式单例模式、懒汉式单例模式、静态内部类在Java中的使用示例_霸道流氓气质的博客-CSDN博客

上面讲了单例模式的三种方式,另外还有一种注册式单例模式。

注册式单例模式

注册式单例模式又称为登记式单例模式,就是将每一个示例都登记到某个地方,使用唯一的标识获取实例。

注册式单例模式又两种:一种是枚举式单例模式,另一种为容器式单例模式。

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

枚举式单例模式

创建EnumSingleton类

package com.ruoyi.demo.designPattern.enumSingleton;/*** 枚举式单例模式*/
public enum EnumSingleTon {INSTANCE;private Object data;public Object getData(){return data;}public void setData(Object data){this.data = data;}public static EnumSingleTon getInstance(){return INSTANCE;}
}

创建测试代码

package com.ruoyi.demo.designPattern.enumSingleton;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;public class EnumSingletonTest {public static void main(String[] args) {try{EnumSingleTon instance1 = null;EnumSingleTon instance2 = EnumSingleTon.getInstance();instance2.setData(new Object());FileOutputStream fos = new FileOutputStream("EnumSingleton.obj");ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(instance2);oos.flush();oos.close();FileInputStream fis = new FileInputStream("EnumSingleton.obj");ObjectInputStream ois = new ObjectInputStream(fis);instance1 = (EnumSingleTon) ois.readObject();ois.close();System.out.println(instance1.getData());System.out.println(instance2.getData());System.out.println(instance1.getData() == instance2.getData());}catch (Exception e){e.printStackTrace();}}
}

运行结果如下

 

为什么用这个序列化测试,因为序列化会破坏其他方式的单例模式效果。

设计模式-静态内部类方式被反射破坏和饿汉式单例模式被序列化破坏解决方式:

设计模式-静态内部类方式被反射破坏和饿汉式单例模式被序列化破坏解决方式_霸道流氓气质的博客-CSDN博客

容器式单例模式

注册式单例模式的另一种写法,容器式单例模式,新建ContainerSingleton类

package com.ruoyi.demo.designPattern.containerSingleton;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** 容器式单例模式*/
public class ContainerSingleton {private ContainerSingleton(){}private static Map ioc = new ConcurrentHashMap<>();public  static  Object getBean(String className){synchronized (ioc){if(!ioc.containsKey(className)){Object obj = null;try{obj = Class.forName(className).newInstance();ioc.put(className,obj);}catch (Exception e){e.printStackTrace();}return obj;}else {return ioc.get(className);}}}
}

容器式单例模式适用于实例很多的情况,便于管理,但它是非线程安全的。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...