设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例
生活随笔
收集整理的這篇文章主要介紹了
设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
場景
設計模式-單例模式-餓漢式單例模式、懶漢式單例模式、靜態內部類在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<String,Object> 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);}}} }容器式單例模式適用于實例很多的情況,便于管理,但它是非線程安全的。
總結
以上是生活随笔為你收集整理的设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一款好用的基于vue的录屏插件recor
- 下一篇: Java freemarker 生成w