Если вы когда-либо думали, что хотите использовать наследование или интерфейсы, вам нужно использовать фактический экземпляр, а не статический класс.Например, что если вы хотите настроить свой экземпляр так, чтобы он выполнял что-то немного отличное от обычного?Вы можете установить одноэлементное значение для экземпляра другой реализации интерфейса или для дочернего класса, который переопределяет определенные функции.Весь код, который обращается к этому экземпляру синглтона, может использовать его точно таким же образом, но его поведение можно изменить.
Я бы добавил, что и синглтоны, и статические классы в наши дни считаются анти-паттернами.,Лучше использовать внедрение зависимостей и просто использовать одноэлементное связывание, если вы хотите одноэлементное поведение.
public class SessionManager {
private static final SessionManager instance;
static {
instance = SystemConfig.isDebug() ? new DebugSessionManager() : new SessionManager();
}
public static SessionManager getInstance() {
return instance;
}
public int getActivePersonId() {
// default implementation
}
}
public class DebugSessionManager : SessionManager {
@Override
public int getActivePersonId() {
// debug implementation
}
}
// The code can be used in the same way regardless of whether we're in debug mode:
int personId = SessionManager.getInstance().getActivePersonId();
Обновление
После прочтения вопроса снова звучит так, как будто вы думаете о чем-тонапример:
public class SessionManager {
private static String systemName;
public String getSystemName() {return systemName;}
}
... при условии, что systemName
никогда не изменится, и поэтому не имеет значения, если к нему обращаются как new SessionManager().getSystemName()
против SessionManager.getInstance().getSystemName()
.В этом случае:
- С семантической точки зрения, когда другой программист видит
new SessionManager()
, он ожидает, что что-то new
создается.Не сразу очевидно, что каждый SessionManager
в системе всегда будет производить один и тот же systemName
.Так что синглтон может быть предпочтительнее просто для того, чтобы сделать для потребителей более очевидным, что они будут иметь дело с одноэлементным состоянием. - При создании
new SessionManager()
возникают очень небольшие накладные расходы, которые впоследствии должны быть мусором.Собрание.
Кроме этого, вы будете иметь те же преимущества и недостатки с этим подходом, как если бы вы использовали Singleton.Я еще раз повторю свое предыдущее утверждение: синглтоны - это анти-паттерн.Предпочитают внедрение зависимостей.