Я знаю, що це старе, але відповідь Dr8k майже була .
Коли ви плануєте написати фрагмент коду, припустимо, що він зміниться. Це не означає, що ви припускаєте, які саме зміни відбудуться в якийсь момент у майбутньому, а скоріше, що будуть внесені певні зміни.
Поставте це за мету, щоб пом’якшити біль, пов’язаний із внесенням змін у майбутньому: глобал небезпечний, тому що ним важко керувати в одному місці. Що робити, якщо я хочу повідомити цей контекст підключення до бази даних у майбутньому? Що робити, якщо я хочу, щоб він закривався і відкривався сам кожен 5-й раз, коли він був використаний. Що робити, якщо я вирішу, що в інтересах масштабування моєї програми я хочу використовувати пул з 10 з'єднань? Або конфігурована кількість з'єднань?
Одноточечного завод дає Вам таку гнучкість. Я налаштовую його з дуже малою додатковою складністю і отримую більше, ніж просто доступ до одного і того ж з'єднання; Я отримую можливість змінити спосіб передачі цього зв’язку мені згодом простою мовою.
Зверніть увагу, що я кажу про фабрику синглтон , на відміну від просто синглтона . Існує дорогоцінна невелика різниця між синглтоном і глобальним, правда. І через це немає жодних підстав для одностороннього з'єднання: чому б ви витрачали час на налаштування цього, коли замість цього могли створити звичайний глобальний?
Що фабрика отримує, це чому отримувати зв’язки та окреме місце, щоб вирішити, які зв’язки (або зв’язки) ви збираєтесь отримати.
Приклад
class ConnectionFactory
{
private static $factory;
private $db;
public static function getFactory()
{
if (!self::$factory)
self::$factory = new ConnectionFactory(...);
return self::$factory;
}
public function getConnection() {
if (!$this->db)
$this->db = new PDO(...);
return $this->db;
}
}
function getSomething()
{
$conn = ConnectionFactory::getFactory()->getConnection();
.
.
.
}
Потім, через 6 місяців, коли ваш додаток стає надзвичайно відомим, і ви вирішили, що вам потрібно більше, ніж одне з’єднання, все, що вам потрібно зробити, це здійснити деякий пул у методі getConnection (). Або якщо ви вирішите, що вам потрібна обгортка, яка реалізує ведення журналу SQL, ви можете передати підклас PDO. Або якщо ви вирішили, що хочете нове підключення при кожному виклику, ви можете це зробити. Він гнучкий, а не жорсткий.
16 рядків коду, включаючи фігурні дужки, що заощадить вам години і години та години рефакторингу до чогось моторошно подібного.
Зверніть увагу, що я не розглядаю цей "Функціональний обхід", оскільки я не виконую жодної функції з першого етапу. Це прикордонна лінія "Future Creep", але в якийсь момент ідея про те, що "кодування на завтра сьогодні" - це завжди погано, для мене не викликає хвилювання.