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

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

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

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

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

Ответ 1

Цель Singleton - ограничить экземпляры объектов одним и обеспечить глобальный доступ.
Обе вещи вам не нужны или нужны.

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

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

Даже Эрих Гамма, один из изобретателей шаблонов Синглтона, задает этот шаблон в наши дни:

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

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

Ответ 2

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

Ответ 3

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

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

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

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