• 设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例


    场景

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

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

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

    注册式单例模式

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

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

    注:

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

    实现

    枚举式单例模式

    创建EnumSingleton类

    1. package com.ruoyi.demo.designPattern.enumSingleton;
    2. /**
    3.  * 枚举式单例模式
    4.  */
    5. public enum EnumSingleTon {
    6.     INSTANCE;
    7.     private Object data;
    8.     public Object getData(){
    9.         return data;
    10.     }
    11.     public void setData(Object data){
    12.         this.data = data;
    13.     }
    14.     public static EnumSingleTon getInstance(){
    15.         return INSTANCE;
    16.     }
    17. }

    创建测试代码

    1. package com.ruoyi.demo.designPattern.enumSingleton;
    2. import java.io.FileInputStream;
    3. import java.io.FileOutputStream;
    4. import java.io.ObjectInputStream;
    5. import java.io.ObjectOutputStream;
    6. public class EnumSingletonTest {
    7.     public static void main(String[] args) {
    8.         try{
    9.             EnumSingleTon instance1 = null;
    10.             EnumSingleTon instance2 = EnumSingleTon.getInstance();
    11.             instance2.setData(new Object());
    12.             FileOutputStream fos = new FileOutputStream("EnumSingleton.obj");
    13.             ObjectOutputStream oos = new ObjectOutputStream(fos);
    14.             oos.writeObject(instance2);
    15.             oos.flush();
    16.             oos.close();
    17.             FileInputStream fis = new FileInputStream("EnumSingleton.obj");
    18.             ObjectInputStream ois = new ObjectInputStream(fis);
    19.             instance1 = (EnumSingleTon) ois.readObject();
    20.             ois.close();
    21.             System.out.println(instance1.getData());
    22.             System.out.println(instance2.getData());
    23.             System.out.println(instance1.getData() == instance2.getData());
    24.         }catch (Exception e){
    25.             e.printStackTrace();
    26.         }
    27.     }
    28. }

    运行结果如下

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

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

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

    容器式单例模式

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

    1. package com.ruoyi.demo.designPattern.containerSingleton;
    2. import java.util.Map;
    3. import java.util.concurrent.ConcurrentHashMap;
    4. /**
    5.  * 容器式单例模式
    6.  */
    7. public class ContainerSingleton {
    8.     private ContainerSingleton(){}
    9.     private static Map ioc = new ConcurrentHashMap<>();
    10.     public  static  Object getBean(String className){
    11.         synchronized (ioc){
    12.             if(!ioc.containsKey(className)){
    13.                 Object obj = null;
    14.                 try{
    15.                     obj = Class.forName(className).newInstance();
    16.                     ioc.put(className,obj);
    17.                 }catch (Exception e){
    18.                     e.printStackTrace();
    19.                 }
    20.                 return obj;
    21.             }else {
    22.                 return ioc.get(className);
    23.             }
    24.         }
    25.     }
    26. }

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

  • 相关阅读:
    HTB-Timelapse
    秒杀活动设计
    百度地图画圆、画扇形、画多边形、画点
    Bandizip批量解压遇到的问题
    畅购商城-第7章商品搜索
    【推荐】数字化转型和案例及IT规划资料整理合集
    【基础知识】PID(比例微分积分)控制
    多功能气象传感器解析
    Leetcode刷题方法总结---字符串全解
    基于Xml方式Bean的配置-beanName个别名配置
  • 原文地址:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127571907