|
|
|
Design Patterns in PHP5
Zurück zur Übersicht Design Patterns bieten elegante Lösung für häufig aufkehrende Probleme in der objektorientierten Programmierung.
Hi,
Ich möchte hier mal einige Design Patterns, auf Deutsch Entwurfsmuster, vorstellen. Dieser Thread
soll auch als Sammelthread für solche Entwurfsmuster sein. Na ja, ich lege mal vor:
Singleton
Oft besteht das Problem, dass man zB bei einer Datenbankklasse ein Konstrukt hat, dass die
Verbindung zur Datenbank herstellt. Aber nun möchte man nicht, dass die Verbindung 2 Mal
ausgeführt wird, sprich, es darf nur einmal ein Objekt dieser Klasse vorhanden sein und es dürfen
auch nicht mehr Objekte erstellt werden.
Hier mal ein Codeschnipsel für Singleton:
| PHP |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
|
<?php
class Singleton
{
//Unser Objekt der Klasse Singleton
private static $objekt = null;
//Konstruktor
private function __construct ()
{
//Könnte auch ne Datenbankverbindung sein
printf('Konstruktor der Klasse %s wurde aufgerufen!',
get_class($this) );
}
public static function getInstance ()
{
//Falls noch nich getan, Referenz
//der Klasse auf das Objekt übertragen
if(is_null(self::$objekt))
self::$objekt = new Singleton;
//Objekt zurückgeben
return self::$objekt;
}
} //Ende: Singleton
//Anwendung:
//Gibt die Instanz der Klasse zurück
//und führt den Konstruktor aus
$Objekt = Singleton::getInstance();
//Noch eine Instanz
//Diesmal wird der Konstruktor nicht ausgeführt,
//man erhält genau das gleiche Objekt wie $Objekt
$Objekt2 = Singleton::getInstance();
?>
|
|
Fabrik
Eine Fabrik baut Objekte zur Laufzeit zusammen. Das ist ganz praktisch, wenn man zur Laufzeit
des Skriptes noch nicht genau weiß, ob überhaupt und welches Objekt benötigt wird. Welche Klasse
benötigt wird, kann zB erst über Get-Parameter deutlich werden, daher wäre es sinnlos, alle 100
Klassen zu includen, obwohl nur eine benötigt wird.
Codeschnipsel für eine Factory
| PHP |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
|
<?php
class Factory
{
/**
* Konstante, Pfad zu den Klassen
*/
const DIR = '/Pfad/zu/den/Klassen/';
/**
* Baut das Objekt zusammen, mit Fehlerbehandlung
* und Paketmöglichkeiten
*
* @param string $class - Name der Klasse
* @param mixed $param - Parameter der Klasse
* @return objekt - Instanz der Klasse
*/
public static function getClass ($className, $param = null)
{
//Ist der Klassenname gültig?
if(!is_string($className))
exit ('Kein gültiger Klassenname: ' . $className);
//Existiert die Klasse schon?
if(!class_exists($className))
exit('Die Klasse existiert schon: ' . $className);
//Existiert die Datei?
$file = self::DIR . str_replace('::', '/', $className) . '.class.php';
if(!file_exists($file))
exit('Die Datei existiert nicht: ' . $file);
require_once ($file);
try
{
//Name vom Paket trennen
$tmp = explode('::', $className);
$class = array_pop($tmp);
//Objekt bauen
$objekt = new $class($param);
}
catch(Exception $e)
{
throw new Exception ('Fehler beim Konstruiren des Objektes<br />
Failes to construct the object: \'' . $className . '\'');
}
}
}
//Anwendung:
//Bindet Klasse: /Pfad/zu/den/Klassen/Datenbak/MySQL.class.php ein
//Und erstelt Objekt der Klasse 'MySQL'
$objekt =& Factory::getClass('Datenbank::MySQL');
//Man könnte in der Fabrik noch ein Singleton einbaun,
//also ein Array, das alle erstellten Objekte speichert.
//Und wenn eins erneut erstellt wird, das passende Objelt
//aus dem Array zurückgeben...
?>
|
|
Es gibt noch viele weitere Design Patterns, aber jetzt hab ich grad keine Lust mehr :D
Hinzu kommt noch:
Observer Pattern
Fassade Pattern
Es gibt noch viele viele mehr, also schön sammeln ;)
Freue mich über jedes hier reingestelltes Design Pattern :)
Gruß,
Basti
Kommentare
Zurück zur Übersicht
Autor B.C.
|
|
|
|