2010-10-06 4 views
2

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

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

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

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

ответ

2

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

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

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

Даже Erich Gamma, один из изобретателей паттерна одиночка, в вопросы этой модели в настоящее время:

"I'm in favor of dropping Singleton. Its use is almost always a design smell"

Вы лучше от избегая синглтонов.

2

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

+0

+1 для антипаттерн – Gordon

+0

Это довольно спорный. Он чрезмерно используется и содержит значительные оговорки, но он выполняет определенную функцию, и мне трудно сказать, что это всегда неправильно. – annakata

+0

Это не всегда неправильно. Синглтон - это хороший способ предотвратить катастрофу, когда из-за чего-то что-то может повредить вещи. Но в большинстве случаев это неправильно, и это слишком часто злоупотребляют/злоупотребляют. Его никогда не следует добавлять в список общих решений общих проблем (которые, когда вы нарушаете это, должны быть шаблонами). Большинство людей почти никогда не должны использовать Синглтон, и, вероятно, не хотели бы, если бы он не был благословлен GoF. – cHao

0

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

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") и избегать, чтобы всегда импортировать глобальный $ дб вар.

+0

Функции определены в глобальной области, поэтому использование этого в классе имеет ту же проблему связи и инкапсуляции, что и 'global $ db;' или 'DB :: getInstance();' – Gordon

+0

Кроме того, поскольку 'db()' возвращает PDO, я могу просто клонировать его, чтобы получить несколько экземпляров. Попробуйте 'var_dump (db(), clone (db()));' – Gordon

+0

То же, что и все объекты в PHP. Семантика ООП не допускает реальных синглетонов. – mario