下面这个写法还是比较通用的
// 注意点1:这里设置无参构造函数为私有化
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class SQLParserEngineFactory {
// 注意点2,这里是concurrentHashMap是为了线程安全考虑
private static final Map<String, SQLParserEngine> ENGINES = new ConcurrentHashMap<>();
/**
* Get SQL parser engine.
*
* @param databaseTypeName name of database type
* @return SQL parser engine
*/
// 注意点3:这里的入参为final类型
public static SQLParserEngine getSQLParserEngine(final String databaseTypeName) {
if (ENGINES.containsKey(databaseTypeName)) {
return ENGINES.get(databaseTypeName);
}
synchronized (ENGINES) {
// 注意点4:这里需要再次判断一次
if (ENGINES.containsKey(databaseTypeName)) {
return ENGINES.get(databaseTypeName);
}
SQLParserEngine result = new SQLParserEngine(databaseTypeName);
ENGINES.put(databaseTypeName, result);
return result;
}
}
}