Я понимаю, что singleton применяет класс, который будет создан один раз. Но почему экземпляр существует, если я не получаю его напрямую? Почему этот шаблон для, не проще ли просто использовать полный статический класс со статическими методами и данными?
Некоторое время назад меня спрашивали, в чем преимущество использования singleton над использованием статического класса, вот мой ответ:
Основное различие между статическим классом и синглетом заключается в том, что со статическим классом вам нужно жестко указывать имя класса в коде везде, где вы его используете:
StaticClass::doSomething(); StaticClass::doSomethingElse();
В то время как с одноэлементным, вам нужно только жестко указать имя класса один раз:
$singleton = SingletonClass::getInstance(); // other code does not need to know where $singleton came from, // or even that class SingletonClass exists at all: $singleton->doSomething(); $singleton->doSomethingElse();
Другое важное отличие состоит в том, что одноэлементные классы могут быть частью иерархии и могут реализовывать интерфейсы.
Это не означает, что Синглтон (шаблон) хорош и должен использоваться либерально. Но это лучше, чем использование статического класса напрямую.
[Изменить]: материал, который я написал ниже, на самом деле не прав. Только что получил ответ на этот ответ много лет назад с помощью downvote. Они служат цели;)
Одноэлемент существует один раз, но он может иметь внутреннее состояние – в противоположность статическому классу. Например, вы можете использовать его как глобальный реестр, который вы не можете сделать со статическим классом.
[Edit:] Что будет дальше, тем не менее, так же верно, как и когда-либо.
Это спорно одиночки ли это хорошая идея, хотя. Они вводят глобальное состояние в приложение, которое может очень трудно проверить. Но это еще одна дискуссия.