Будет ли синглтон хорошим шаблоном дизайна для сайта микроблогов?

Я не использовал OO в прошлом в проектах, поскольку я делал это проще (фактически используя архаичные вызовы mysql_query и мою собственную фильтрацию), поэтому я хотел начать новый проект, научившись использовать шаблоны проектирования с моим OO. ,

Я искал, чтобы создать сайт микроблогов для ног, и нашелшаблон дизайна синглтон класс, который казался завершенным, и использовать сPDO Я не вижу в этом ничего плохого (кроме невозможности получить доступ к двум базам данных, которые я не уверен, что мне понадобится для этого проекта).

Скажем, такой проект или простое CMS-программное обеспечение - хорошая идея? Какие типы шаблонов проектирования / тип класса базы данных будут использовать "большие парни" для этих вещей, будет ли это слишком ограничительным в дальнейшем, если это будет масштабироваться (одновременные соединения / производительность)?

Я также читал о фабричном синглтоне, чтобы позже иметь дело с дополнительными соединениями, так как в нем проще изменить код. Устранит ли это какие-либо негативные проблемы и сделает ли это более подходящим для этого шаблон проектирования?

Ответы на вопрос(3)

синглтон не очень помогает вам с вашим блог-приложением. Просто создайте один экземпляр базы данных и используйте его.

Sidenode, то, что вы видите в PHP, часто являются «поддельными синглетонами». Если он реализован как обычный класс, он обычно включает использование::getInstance() метод, который реализует одноэтапное обходное решение. Однако существование класса позволяет создавать экземпляры нескольких элементов (new Singleton () && new Singleton ()). Поэтому я бы порекомендовал процедурный синглтон, который не имеет этой проблемы, а также гораздо приятнее для глаз:

 function db() {
     static $db;
     if (!isset($db)) {
          $db = new PDO("sqlite:memory");
     }
     return $db;
 }

Таким образом, вы можете использоватьdb()->query("SELECT * FROM blog") и избегайте всегда импортировать глобальную переменную $ db.

 mario06 окт. 2010 г., 12:56
То же, что и все объекты в PHP. Семантика ООП не допускает реальных синглетонов.
 Gordon06 окт. 2010 г., 12:03
Кроме того, так какdb() возвращает объект PDO, я могу просто клонировать его, чтобы получить несколько экземпляров. Пытатьсяvar_dump(db(), clone(db()));
 mario06 окт. 2010 г., 14:41
Я не уверен. Есть случайный случай использования. И если бы был, например, встроенный в язык и поддерживающий базовый класс SPL_Singleton, люди могут легко добавить или удалить его снова. Или случайно отключить его через php.ini, LOL
 Gordon06 окт. 2010 г., 11:50
Функции определены в глобальной области видимости, поэтому использование этого в классе имеет ту же проблему связывания и инкапсуляции, что иglobal $db; или жеDB::getInstance();
 Gordon06 окт. 2010 г., 13:29
Не правда. Ты можешь сделатьprivate function __clone() {} а такжеprivate function __construct() предотвратить множественное создание экземпляров и клонирование.Смотрите пример Singleton в руководстве по PHP
 Gordon06 окт. 2010 г., 14:21
Нет,новый подразумевает новый экземпляр иклон подразумевает клонированный экземпляр. Даже если бы вы могли (не можете) сделать так, чтобы они возвращали один и тот же экземпляр, это было бы семантически неверно. Это не соответствует ожиданиям. Книга GoF использует статический метод для создания и обработки экземпляра, поэтому пример, приведенный в руководстве по PHP, «правильный».
 Gordon06 окт. 2010 г., 14:36
На самом деле, мой личный фаворит был бы, если бы PHP автоматически обнаруживал любые шаблоны Singleton и выдавал исключение YagniException: D
 mario06 окт. 2010 г., 14:33
Определение Библии GoF тогда не соответствует моим ожиданиям. Если предполагается, что синглтон существует только один раз, тогда мне не стоит беспокоиться об этом. Давайте назовем синглтоны вспомогательного метода для того, чем они являются: синглтоны вспомогательного метода. ;}
 mario06 окт. 2010 г., 13:50
Профилактика ок. Хотя было бы более правильным синглтоном, если бы __clone мог просто вернуть $ this. Или если бы был способ иметьnew Singleton() == new Singleton() без вспомогательных методов и обходных путей.
Решение Вопроса

спечить глобальный доступ.
Обе вещи вам не нужны или не нужны.

Ограничение вашего экземпляра одним экземпляром довольно бессмысленно в PHP, где это ограничение применяется только к экземплярам вток запрос. Если два запроса попадают на ваш сайт микроблогов одновременно, по-прежнему будет по одному экземпляру на каждый запрос. Если вы хотите убедиться, что существует только один экземпляр, просто не создавайте экземпляр второго экземпляра.

Глобальный доступ тоже ничего не значит, потому что он нарушает инкапсуляцию. Если вам нужен определенный экземпляр внутри ваших объектов, передайте его черезвнедрение зависимости, Это чисто и ремонтопригодно. Это дает дополнительное преимущество, позволяя вам легко обмениваться зависимостями с другими реализациями, как, например,фиктивные занятия для тебямодульные тесты.

ЧетноеЭрих ГаммаОдин из изобретателей модели Синглтона ставит под сомнение эту модель в настоящее время:

«Я за то, чтобы отказаться от Singleton. Его использование почти всегда является запахом дизайна»

Лучше всего избегать синглетонов.

Если я не ошибаюсь, синглтон - этоантипаттерн, Но в зависимости от задачи его можно использовать.

 Gordon06 окт. 2010 г., 10:26
+1 за Антипаттерн
 annakata06 окт. 2010 г., 10:27
Это довольно спорное. Он чрезмерно используется и сопровождается существенными оговорками, но он выполняет определенную функцию, и мне трудно сказать, что это всегда неправильно.
 cHao06 окт. 2010 г., 10:55
Это не всегда неправильно. Когда наличие более чем одной вещи может привести к взрыву, Singleton - хороший способ предотвратить катастрофу. Но в большинстве случаев это неправильно и слишком часто злоупотребляет / злоупотребляет. Он никогда не должен был добавляться в список общих решений общих проблем (который, когда вы разбиваете его, является тем, что образцы должны были быть). Большинство людей почти никогда не должны использовать Синглтон, и, вероятно, не будет, если бы не было благословения со стороны GoF.

Ваш ответ на вопрос