Singleton / SessionSingleton

Das Singleton-Pattern ist ein in der Entwicklung weit verbreitetes Pattern. Es gehört zur Gruppe der Erzeuger-Pattern und wird vielfach deshalb eingesetzt um Informationen oder Funktionen von definierten Objekten innerhalb einer kompletten Applikation zur Verfügung zu haben. Im Bereich der Trennung einer Applikation in unterschiedliche Schichten wird das Singleton-Pattern oft dafür verwendet, Service-Schichten singleton zu instanziieren um eine bessere Performance bei der Abarbeitung von Business-Prozessen oder dem Laden und Speichern von Daten zu erziehlen.

Das Adventure PHP Framework implementiert zwei spezielle Formen des Entwurfsmusters: eine abstrakte Singleton-Klasse und eine abstrakte Session-Singleton-Klasse. Beide bieten die Möglichkeit, beliebige Klassen im "Singleton-Modus" zu instanziieren. Das Singleton-Pattern wird aus den bereits genannten Gründen im serviceManager bereits implizit eingesetzt. Die Session-Singleton-Implementierung hält Objekte über eine (PHP-)Session als Singleton-Objekte vor. Die Verwendung gestaltet sich analog zur Singleton-Klasse.

1. Singleton

Da die Singleton-Klasse bereits sehr tief im Framework verwoben ist, muss diese nicht explizit eingebunden werden. Um eine Klasse im Singleton-Modus instanziieren können, muss diese an allen Stellen, an denen das Objekt Verwendung findet per

PHP-Code
$object = &Singleton::getInstance('{KlassenName}');

erzeugt werden. Bei der Verwendung von PHP 5 kann auf das & verzichtet werden, da Werte automatisch als Referenz übergeben werden.

2. SessionSingleton

Um die statische Klasse SessionSingleton verwenden zu können, muss diese zunächst per

PHP-Code
import('core::singleton','SessionSingleton');

eingebunden werden. Anschließend kann ein Objekt im "SessionSingleton-Modus" per

PHP-Code
$object = &SessionSingleton::getInstance('{KlassenName}');

erzeut und verwendet werden.

3. Verwendung des ServiceManager

Wie bereits erwähnt, besitzt jede von APFObject abgeleitete Klasse private Wrapper-Methoden um Service-Schichten im Singleton- oder seit Version 1.5.1 im SessionSingleton-Modus zu erstellen. Hier wird zwischen zwei Möglichkeiten unterschieden: einfaches ServiceObjekt und initialisiertes ServiceObjekt. Für einfache Anwndungsfälle genügt das blanke Erstellen eines Singleton-Objekts, in komplexeren und für mehrfache Verwendung ausgelegte Service-Schichten muss diese oft vor Verwendung mit Konfigurationsparameter initialisiert werden.

Seit Version 1.5.1 können die beiden Methoden mit einem weiteren Parameter ausgestattet werden, der indiziert, wie eine ServiceSchicht erzeugt werden soll.

Als Service-Objekt bzw. Service-Schicht wird im Allgemeinen die Instanz einer Klasse genannt, die einer Applikationsschicht im Sinne der 3-Schicht-Architektur einen Service zur Verfügung stellt. Im Fall der Kommunikation der Business-Schicht mit der Datenschicht, stellt die Datenschicht den Service-Layer für die Business-Schicht dar. Im Fall der Präsentationsschicht fungiert die Businessschicht als Service-Komponente zur Koordinierung der Applikationsabläufe.

3.1. getServiceObject()

Im einfachen Anwendungsfall kann per

PHP-Code
$service = &$this->getServiceObject('service::layer::namespace', 'ServiceLayerClassName'[, '{MODE}']);

eine Service-Schicht erzeugt werden. {MODE} kann ab Version 1.5.1 die Werte

  • NORMAL: Klasse wird "normal" instanziiert und konfiguriert
  • SINGLETON: Klasse wird "singleton" instanziiert und konfiguriert
  • SESSIONSINGLETON: Klasse wird "sessionsingleton" instanziiert und konfiguriert

annehmen. Wird {MODE} nicht angegeben, so wird die Instanz als SINGLETON erzeugt.

3.2. getAndInitServiceObject()

Um eine Klasse mit der Methode getAndInitServiceObject() instanziieren zu können, muss diese von APFObject ableiten und eine init() Methode implementieren. Die init() Funktion ist dabei für die Initialisierung der Klasse zuständig. Der Parameter kann dabei ein Array oder ein einfacher String sein. Um eine Instanz der Klasse

PHP-Code
class MyServiceLayer extends APFObject { private $mySpecialParam = null; public function init($initParam){ $this->mySpecialParam = $initParam; } }

mit der Methode getAndInitServiceObject() erzeugen zu können, muss folgender Code an der gewünschten Stelle platziert werden:

PHP-Code
$service = &$this->getAndInitServiceObject('service::layer::namespace','MyServiceLayer','InitParamValue','{MODE}');

Im konkreten Anwendungsfall ist InitParamValue durch einen entsprechenden Initialisierungsparameter zu ersetzen. {MODE} kann ab Version 1.5.1 die Werte

  • NORMAL: Klasse wird "normal" instanziiert und konfiguriert
  • SINGLETON: Klasse wird "singleton" instanziiert und konfiguriert
  • SESSIONSINGLETON: Klasse wird "sessionsingleton" instanziiert und konfiguriert

annehmen.

Kommentare

Möchten Sie den Artikel eine Anmerkung hinzufügen, oder haben Sie ergänzende Hinweise? Dann können Sie diese hier einfügen. Die bereits verfassten Anmerkungen und Kommentare finden Sie in der untenstehenden Liste.
« 1   »
Einträge/Seite: | 5 | 10 | 15 | 20 |
1
Jan Wiese 04.11.2012, 12:07:54
Hallo Jens,

default wird der Modus SINGLETON angewendet.

LG :)
2
Jens Prangenberg 20.09.2012, 08:43:55
Hallo,
welcher {MODE} ist den Default?