Singleton (ActionScript3)

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Version vom 31. Januar 2010, 18:52 Uhr von Killua-x (Diskussion | Beiträge) (Die Seite wurde neu angelegt: == Verwendung von Singleton == Das Singleton ist eines der gängigeren Design Pattern.<br> Ein Singleton wird am besten bei Klassen verwendet, wo es man nur eine Instan...)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Verwendung von Singleton

Das Singleton ist eines der gängigeren Design Pattern.
Ein Singleton wird am besten bei Klassen verwendet, wo es man nur eine Instanz dieser Klasse benötigt.
So könnte man bei Gruppenarbeiten damit verhindern, dass Kollegen eine Instanz einer Klasse erstellen,
wenn man das schon selbst getan hat. In der Regel hat man auch global zugriff auf den Singleton.

Vorteile von Singleton

  • es wird verhindert dass über den new Operator neue Objekte erzeugt werden
  • ein gesteuerter Zugriff ist möglich, der immer die selben Ergebnisse zurückliefert
  • man kann Singletons ableiten und notfalls gewisse methoden überschreiben (Vererbung)
  • gute Alternative zu globale Variablen

Nachteile von Singleton

  • man kann es meist auch anders lösen
  • Singleton können sehr unflexibel sein
  • durch Singleton kann man leicht verleitet werden, eher prozedual anstatt objektorientiert zu programmieren
  • Singletons lassen sich schlecht testen

Probleme in Flash und ein Lösungsweg

In Actionscript ist es leider nicht möglich Konstruktoren auf private zu setzen.
Aber würde man den Konstruktor einfach public stehen lassen, so drohe eine mögliche Manipulation von Außen.

Mit einem Trick kann man eine gewisse Privatisierung des Konstruktors.
In diesem Fall passiert das über die interne Klasse SteuerungPrivat, welche nur von Steuerung aus erreichbar ist.

Beispiel der Implementierung in Flash3

Für das klassische Singleton wird eine statische Methode implementiert, welche das Objekt erzeugt und zurückgibt.

public class Steuerung{
		
      private static var instance:Steuerung;
      private static var allowInstantiation:Boolean;


	public static function getInstance():Steuerung {
         if (instance == null) {
            allowInstantiation = true;
            instance = new Steuerung(new SteuerungPrivat());
            allowInstantiation = false;
          }
         return instance;
       }

	public static function killInstance():Steuerung {
	  if (instance != null) {
            instance = null;
            allowInstantiation = true;
          }
         return instance;
	}

		public function Steuerung(se:SteuerungPrivat){
		}
}}
internal class SteuerungPrivat {}


Der Zugriff auf den Singleton ist nur über die Methode getInstance() möglich. Intern kann der Singleton auch andere Methoden haben auf die man via getInstance() auch selbst Zugriff hat.
Beim Löschen des Singletons muss man auch schauen, dass auch die interne statische Instanz überschrieben wird. Andernfalls würde der Singleton beim nächsten Aufruf die alten Werte aus der Instanz bekommen.