OOP Das Singleton Pattern

von tantetoni2 am 28. März 2011 um 20:36 Uhr. »
Kommentare (0)  | Drucken

Design Pattern (Entwurfsmuster)

Pattern sind eine Möglichkeit, um optimale Verfahren und gute Entwürfe zu beschreiben. Sie zeigen eine flexible Lösung für verbreitete Programierprobleme.


Kategorie

Das Singleton Pattern wird zu den "Creational Patterns" gezählt, da es Objekte erzeugt und zurückliefert.

Der Einsatzbereich des Singleton Patterns

Das Einzelstück (Singleton) Pattern greift in Situationen, in denen es nur eine Instanz einer Klasse geben darf, dabei wird die direkte Instanziierung des Objekts über den Standardkonstuktor verhindert, in dem dieser den modifier private verwendet.
Damit aber auch außerhalb der Klasse eine Instanz angefordert werden kann wird eine statische Methode namens getInstance() beireitgestellt, diese Methode liefert dann die einzige Instanz der klasse zurück

Das gebräuchlichste Beispiel ist eine Datenbankverbindung. Die Implementierung dieses Musters erlaubt dem Programmierer diese einzige Instanz leicht für viele andere Objekte zugänglich zu machen.

Vorteile

  • Zugriffskontrolle kann realisiert werden.
  • Das Einzelstück kann durch Unterklassenbildung spezialisiert werden.
  • Welche Unterklasse verwendet werden soll, kann zur Laufzeit entschieden werden
  • Die Einzelinstanz muss nur erzeugt werden, wenn sie benötigt wird.

Nachteile

  • Es besteht die große Gefahr, durch exzessive Verwendung von Singletons quasi ein Äquivalent zu globalen Variablen zu implementieren und damit dann prozedural anstatt objektorientiert zu programmieren.
  • Abhängigkeiten zur Singleton-Klasse werden verschleiert, d. h. ob eine Singleton-Klasse verwendet wird, erschließt sich nicht aus dem Interface einer Klasse, sondern nur anhand der Implementierung. Zudem wird die Kopplung erhöht, was Wiederverwendbarkeit und Übersichtlichkeit einschränkt.

Beispiele


lazy initialization
Das Konzept der lazy initialization, d.h. das Objekt wird erst instanziiert, wenn es erstmalig angefordert wird. Der Vorteil ist, daß, wenn das Singleton niemals verwendet wird, getInstance() also niemals aufgerufen wird, auch kein Speicher (und damit ggf. verbunde Resourcen) belegt wird.


JAVA ohne lazy initialization


JAVA CODE
  1. public class SimpleSingleton {
  2.     private static SimpleSingleton INSTANCE = new SimpleSingleton();
  3.  
  4.     //Marking default constructor private
  5.     //to avoid direct instantiation.
  6.     private SimpleSingleton() {
  7.     }
  8.  
  9.     //Get instance for class SimpleSingleton
  10.     public static SimpleSingleton getInstance() {
  11.         return INSTANCE;
  12.     }
  13. }


JAVA mit lazy initialization


JAVA CODE
  1. public class SimpleSingleton {
  2.     private SimpleSingleton singleInstance = null;
  3.  
  4.     //Marking default constructor private
  5.     //to avoid direct instantiation.
  6.     private SimpleSingleton() {
  7.     }
  8.  
  9.     //Get instance for class SimpleSingleton
  10.     public static SimpleSingleton getInstance() {
  11.         if(null == singleInstance) {
  12.             singleInstance = new SimpleSingleton();
  13.         }
  14.         return singleInstance;
  15.     }
  16. }

So und da es ja nur eine Instanz des Objektes geben darf müssen das clonen der Instanz unterbinden, das geschieht wie folgt

JAVA CODE
  1. public Object clone() throws CloneNotSupportedException {
  2.       throw new CloneNotSupportedException();
  3. }

und wenn das ganze multi-threaded fähig sein soll müsste die getInstance() Methode den modifier synchronized bekommen
also so

JAVA CODE
  1. public static synchronized SimpleSingleton getInstance(){ .... }


Hier die PHP5 Variante mit lazy initialization


PHP CODE
  1. <?php
  2. class Beispiel
  3. {
  4.     // Speichert die Instanz der Klasse
  5.     private static $instance = null;
  6.  
  7.     // Ein private-Konstruktor; verhindert die direkte Erzeugung des Objektes
  8.     private function __construct() {
  9.         echo 'Ich bin hergestellt';
  10.     }
  11.  
  12.     // Die Singleton-Methode
  13.     public static function singleton() {
  14.         if ( self::$instance === null ) {
  15.             self::$instance = new self();
  16.         }
  17.  
  18.         return self::$instance;
  19.     }
  20.  
  21.     // Beispielmethode
  22.     public function bellen() {
  23.         echo 'Wuff!';
  24.     }
  25.  
  26.     // Halte Benutzer vom Klonen der Instanz ab
  27.     public function __clone() {
  28.         trigger_error( 'Klonen ist nicht erlaubt.', E_USER_ERROR );
  29.     }
  30. }
  31. ?>

Änliche Beiträge

Diesen Beitrag teilen

RSS-Feed  auf Twitter.com teilen  auf delicious.com teilen  auf Digg.com teilen   auf Facebook.com teilen


Kommentare
noch keine Kommentare vorhanden