refactor singletons based on initialization-on-demand holder idiom