improve singleton