记一次比较好的设计(单例(双重校验+volatitle)、反射(反射过后会缓存减少反射次数)、缓存(防止缓存穿透、缓存击穿))

记一次比较好的设计(单例(双重校验+volatitle)、反射(反射过后会缓存减少反射次数)、缓存(防止缓存穿透、缓存击穿))

package spzc.module.fileImport.fileExport.exportor;

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

public class FileExportorManager {

 public static final String EXPORTOR_PACKAGE = "spzc.module.fileImport.fileExport.exportor.impl.";

 public static final String EXPORTOR_SUFFIX = "Exportor";

 private Map<String, IFileExportor> importors = new ConcurrentHashMap<>();

扫描二维码关注公众号,回复: 8728732 查看本文章

 private volatile static FileExportorManager instance;

 private FileExportorManager() {

 }

 public static FileExportorManager getInstance() {

  if (instance == null) {

   synchronized (FileExportorManager.class) {

    if (instance == null) {

     instance = new FileExportorManager();

    }

   }

  }

  return instance;

 }

 @SuppressWarnings({ "unchecked", "deprecation" })

 public IFileExportor get(String key) {

  if (importors == null) {

   return null;

  }

  if (importors.containsKey(key)) {

   return importors.get(key);

  }

  IFileExportor exportor = null;

  synchronized (Object.class) {

   if (importors.containsKey(key)) {

    return importors.get(key);

   }

   try {

    Class<? extends IFileExportor> clazz = (Class<? extends IFileExportor>) Class

      .forName(EXPORTOR_PACKAGE + key + EXPORTOR_SUFFIX);

    exportor = clazz.newInstance();

   } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {

    e.printStackTrace();

   }

   importors.put(key, exportor);

  }

  return exportor;

 }

}

发布了48 篇原创文章 · 获赞 4 · 访问量 3244

猜你喜欢

转载自blog.csdn.net/Sunxn1991/article/details/102938597