【单例设计模式(起服时初始化)】 1.reflections 2.起服时initialize

InstanceManager.java

package org.example.testmgr;

import org.reflections.Reflections;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

public abstract class InstanceManager {
    private static Map<String, InstanceManager> instances = new ConcurrentHashMap<>();

    /**
     * 暴露出接口,获取单例类
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T extends InstanceManager> T inst(Class<?> clazz) {
        Object inst = instances.get(clazz.getName());
        if (inst == null) {
            throw new RuntimeException("获取单例出错" + clazz.getName());
        }
        return (T) inst;
    }

    /**
     * 供自己调用下初始化所有的单例类
     * 一般是起服时调用
     */
    public static void initialize() {
        Reflections reflections = new Reflections("org");
        Set<Class<? extends InstanceManager>> set = reflections.getSubTypesOf(InstanceManager.class);
        set.forEach(c -> {
            try {
                InstanceManager inst = c.getConstructor().newInstance();
                inst.init();

                instances.put(c.getName(), inst);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }

    /**
     * 留给子类去初始化
     */
    public abstract void init();
}

GuildConfig.java

package org.example.testmgr;

public class GuildConfig extends InstanceManager {
    private int status = 0;

    @Override
    public void init() {
        System.out.println("Guild init");
        status = 1;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }
}

Main.java

package org.example.testmgr;

public class Main {
    public static void main(String[] args) {
        // 初始化 所有的代理对象
        InstanceManager.initialize();

        // 单例类测试
        GuildConfig guild = InstanceManager.inst(GuildConfig.class);
        int status = guild.getStatus();
        System.out.println(status);
    }
}

/*
Guild init
1
 */

思考:

这个单例类写法有各种各样,有些要求起服时做下初始化,如:配置不能重复读取,需要加载到内存。这种写法相当于起服时会自动调用init方法。

如:排行榜需要15min持久化一次到数据库,那么起服时会启动一个定时器,因此这种都可以使用这类单例模式。

甚至最好在inst中再写一下inst方法,返回InstanceManager.inst(xxx.class)这样子 可以不用传参数了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值