下面这个写法还是比较通用的

    1. // 注意点1:这里设置无参构造函数为私有化
    2. @NoArgsConstructor(access = AccessLevel.PRIVATE)
    3. public final class SQLParserEngineFactory {
    4. // 注意点2,这里是concurrentHashMap是为了线程安全考虑
    5. private static final Map<String, SQLParserEngine> ENGINES = new ConcurrentHashMap<>();
    6. /**
    7. * Get SQL parser engine.
    8. *
    9. * @param databaseTypeName name of database type
    10. * @return SQL parser engine
    11. */
    12. // 注意点3:这里的入参为final类型
    13. public static SQLParserEngine getSQLParserEngine(final String databaseTypeName) {
    14. if (ENGINES.containsKey(databaseTypeName)) {
    15. return ENGINES.get(databaseTypeName);
    16. }
    17. synchronized (ENGINES) {
    18. // 注意点4:这里需要再次判断一次
    19. if (ENGINES.containsKey(databaseTypeName)) {
    20. return ENGINES.get(databaseTypeName);
    21. }
    22. SQLParserEngine result = new SQLParserEngine(databaseTypeName);
    23. ENGINES.put(databaseTypeName, result);
    24. return result;
    25. }
    26. }
    27. }