Wiem, że to stare, ale odpowiedź Dr8k była prawie gotowa .
Kiedy rozważasz napisanie fragmentu kodu, załóż, że to się zmieni. Nie oznacza to, że zakładasz rodzaje zmian, które w pewnym momencie przyniesie to w przyszłości, ale raczej, że nastąpi jakaś zmiana.
Niech to będzie cel, złagodzenie bólu związanego z wprowadzaniem zmian w przyszłości: globalny jest niebezpieczny, ponieważ trudno nim zarządzać w jednym miejscu. Co się stanie, jeśli w przyszłości chcę uwrażliwić kontekst połączenia z bazą danych? Co jeśli chcę, aby zamykał się i otwierał ponownie co piąty raz, gdy był używany. Co się stanie, jeśli zdecyduję, że w celu skalowania mojej aplikacji chcę użyć puli 10 połączeń? A może konfigurowalna liczba połączeń?
Fabryka Singleton daje taką elastyczność. Skonfigurowałem to z bardzo małą dodatkową złożonością i zyskuję więcej niż tylko dostęp do tego samego połączenia; Uzyskuję możliwość zmiany sposobu, w jaki to połączenie jest później do mnie przekazywane w prosty sposób.
Zauważ, że mówię o pojedynczej fabryce, a nie po prostu o singletonie . To prawda, że istnieje niewielka różnica między singletonem a globalnym. Z tego powodu nie ma powodu, aby mieć pojedyncze połączenie: dlaczego miałbyś spędzać czas na konfigurowaniu tego, skoro zamiast tego możesz utworzyć zwykły globalny?
To, co daje ci fabryka, to powód, dla którego chcesz uzyskać połączenia, i oddzielne miejsce, w którym możesz zdecydować, jakie połączenia (lub połączenie) otrzymasz.
Przykład
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();
.
.
.
}
Następnie, w ciągu 6 miesięcy, gdy Twoja aplikacja jest bardzo znana, zostaje dugg and slashdotted, a Ty zdecydujesz, że potrzebujesz więcej niż jednego połączenia, wszystko, co musisz zrobić, to zaimplementować kilka pul w metodzie getConnection (). Lub jeśli zdecydujesz, że potrzebujesz opakowania, które implementuje rejestrowanie SQL, możesz przekazać podklasę PDO. Lub jeśli zdecydujesz, że chcesz mieć nowe połączenie przy każdym wywołaniu, możesz to zrobić. Jest elastyczny zamiast sztywnego.
16 linii kodu, w tym nawiasy klamrowe, co pozwoli Ci zaoszczędzić wiele godzin na refaktoryzacji do czegoś niesamowicie podobnego w przyszłości.
Zauważ, że nie uważam tego „Pełzania funkcji”, ponieważ nie wykonuję żadnej implementacji funkcji w pierwszej turze. To pogranicze „Future Creep”, ale w pewnym momencie pomysł, że „kodowanie na jutro dzisiaj” jest zawsze złą rzeczą, nie podoba mi się.