Будет ли синглтон хорошим шаблоном дизайна для сайта микроблогов? - PullRequest
2 голосов
/ 06 октября 2010

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 06 октября 2010

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

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

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

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

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

Лучше избегать одиночных игр.

2 голосов
/ 06 октября 2010

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

0 голосов
/ 06 октября 2010

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

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.

...