Moin!
Dein Stichwort lautet "Dependency Injection", und es löst die Fragestellung "Wie kann ein Objekt auf andere Objekte zugreifen, die es zur Erfüllung seiner Aufgabe braucht?"
Mit Dependency Injection übergibt man dem empfangenden Object ein anderes Objekt, das es zu seiner Arbeit braucht. Wobei man ihm mal dieses und mal jenes übergeben kann, beispielsweise ein wirklich arbeitendes oder auch mal ein Dummy zum Testen. Sehr nettes Pattern um komplexe Anforderungen flexibel lösen zu können.
Deshalb sehr schlau und definitiv zu bevorzugen. Wobei man sich Frameworks dafür oft schenken kann, sofern man das Zusammenbauen von Klassen schön in eigenen Factory-Klassen kapselt.
Das Singleton-Pattern ist im Übrigen eines, das man nach Möglichkeit vermeiden sollte, insbesondere für Datenbankzugriff.
Ein Singleton eignet sich, wenn ein oder mehrere Objekte wissen, wo sie hingreifen müssen. In dem Fall kann man auch keinen Dummy gezielt unterschieben. Warum aber soll man das vermeiden und warum insbesondere beim Datenbankzugriff?
Singletons sind die Objekt gewordene Reinkarnation der globalen Variablen. Sie sind schwierig vernünftig testbar, sie enthalten sehr leicht "global state", der sich störend auf den Programmablauf auswirken kann, wenn er nicht beabsichtigt ist.
Und die Datenbank ist in den seltensten Fällen zwingend singular. Im Gegenteil: Der Zugriff auf den persistenten Speicher erfolgt immer häufiger so, dass für den jeweiligen Zweck optimierte Speichermethoden benutzt werden, und zwischen den einzelnen Klassen mit "Datenbankzugriff" auch schon mal unterschiedliche. Zumal ein Datenbankzugriff ohnehin Puffer benötigt, die man nicht singletonisieren kann - und mysql_connect() bei zwei Aufrufen mit identischen Parametern die bestehende Connection verwendet, also der Haupteffekt des Singletons schon von der zugrundeliegenden Funktion erfüllt wird.
- Sven Rautenberg