首页 > 编程语言 >Java中枚举类的特殊用法-使用枚举实现单例模式和策略模式

Java中枚举类的特殊用法-使用枚举实现单例模式和策略模式

时间:2023-05-31 14:56:05浏览次数:50  
标签:Java 模式 枚举 单例 save type public

场景

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

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127555096

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

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127571907

设计模式-策略模式在Java中的使用示例:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127622238

SpringBoot中使用枚举类、switch、常量类(声明并初始化map)实现类策略者模式,接口返回常量数据:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130842333

上面针对枚举类实现单例模式和策略模式有所涉及,下面补充。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

Java中使用枚举类实现单例模式

为什么可以这样做?

枚举类不能new,因此保证单例

枚举类不能被继承

类不加载时,不会实例化

使用枚举类创建的单例还有一个好处,就是即使使用反射,也无法打破它的单例性质

新建枚举类

public enum SingleEnum {
    INSTANCE;
    public void print(String world){
        System.out.println(world);
    }
}

调用示例

SingleEnum.INSTANCE.print("hello badao");

Java中使用枚举类实现策略模式

举例-接口通过接受的参数,来决定最终的数据存在什么地方,为了避免很多的if-else

新建枚举类

public enum SaveStrategyEnum {

    DB("db"){
        @Override
        public void save(Object obj) {
            System.out.println("save to db:"+obj);
        }
    },
    FILE("file"){
        @Override
        public void save(Object obj) {
            System.out.println("save to file:"+obj);
        }
    },
    OSS("oss"){
        @Override
        public void save(Object obj) {
            System.out.println("save to oss:"+obj);
        }
    };

    private String type;

    SaveStrategyEnum(String type){
        this.type = type;
    }

    public abstract void save(Object obj);

    public static SaveStrategyEnum typeOf(String type){
        for (SaveStrategyEnum strategyEnum:values()) {
            if(strategyEnum.type.equalsIgnoreCase(type))
            {
                return strategyEnum;
            }
        }
        return null;
    }

    public void save(String type,Object data){
        SaveStrategyEnum saveStrategyEnum = SaveStrategyEnum.typeOf(type);
        if (saveStrategyEnum !=null)
        {
            saveStrategyEnum.save(data);
        }
    }

 

}

 

标签:Java,模式,枚举,单例,save,type,public
From: https://www.cnblogs.com/badaoliumangqizhi/p/17446064.html

相关文章

  • 前端 React + vite + Typescript 后端 java + springmvc + jwt 跨域 解决方案
    首先后端配置跨域:web.xml文件: <!--配置跨域--><filter><filter-name>header</filter-name><filter-class>org.zhiyi.config.Cross</filter-class></filter><filter-mapping><......
  • Java中常见转换-数组与list互转、驼峰下划线互转、Map转Map、List转Map、进制转换的多
    场景Java中数组与List互转的几种方式数组转List1、最简单的方式,Arrays.asList(array);创建的是不可变列表,不能删除和新增元素String[]array=newString[]{"a","b"};List<String>stringList=Arrays.asList(array);System.out.println(strin......
  • golang实现设计模式之工厂模式总结-代码、优缺点、适用场景
    工厂模式也是一种创建型模式,它与简单工厂不同的是将实例的创建推迟到具体的工厂类方法中实现,每一种产品生成一个对应的工厂,从而替换掉简单工厂方法模式中那个静态工厂方法。所以在工厂模式中,不同产品就由不同的工厂生产,每次增加产品时,我们就不需要在类似在简单工厂中,在统一的工厂......
  • java - stream流
    一、创建stream流1、通过集合创建,这里以List为例List<Integer>integerList=newArrayList<>();integerList.add(1);integerList.add(2);integerList.add(3);Stream<Integer>stream1=integerList.stream(); 2、Array......
  • Java大文件分片上传/多线程上传功能
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • java api 设置kettle 日志到数据库
    设置到数据库transMeta.addDatabase(getDatabaseMeta(config));TransLogTableorigTransLogTable=transMeta.getTransLogTable();origTransLogTable.setConnectionName(config.getName());origTransLogTable.setTableName("r_log_trans&......
  • Java的volatile
    介绍volatilevolatile关键字可以说是Java虚拟机提供的最轻量级的同步机制,但是它并不容易被正确、完整地理解,以至于许多程序员都习惯去避免使用它,遇到需要处理多线程数据竞争问题的时候一律使用synchronized来进行同步。了解volatile变量的语义对理解多线程操作的其他特性......
  • Java的volatile
    介绍volatilevolatile关键字可以说是Java虚拟机提供的最轻量级的同步机制,但是它并不容易被正确、完整地理解,以至于许多程序员都习惯去避免使用它,遇到需要处理多线程数据竞争问题的时候一律使用synchronized来进行同步。了解volatile变量的语义对理解多线程操作的其他特性......
  • 序列化Java对象重命名字段,@JSONField、@JsonProperty、@SerializedName
    @JSONField主要用于返回出参转换这个注解分别可以注解在实体类的属性、setter和getter方法上publicclassTest{/*注解在属性上的时候可以设置一些序列化、格式化的属性@JSONField(serialize=false)---->序列化的时候忽略这个属性@JSO......
  • 03.外观模式
    外观式定义为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。界面在这里提到的界面,主要指的是从一个组件外部来看这个组件,能够看到什么,这就是这个组件的界面,也就是所说的外观。接口在这里提到的接口,主要指的是外部......