|
|
| Zeile 1: |
Zeile 1: |
| == 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 Instanz dieser Klasse benötigt. <br>
| |
| So könnte man bei Gruppenarbeiten damit verhindern, dass Kollegen eine Instanz einer Klasse erstellen, <br>wenn man das schon selbst getan hat.
| |
| In der Regel hat man auch global zugriff auf den Singleton. <br>
| |
|
| |
|
| == Vorteile von Singleton ==
| |
| <ul>
| |
| <li> es wird verhindert dass über den new Operator neue Objekte erzeugt werden</li>
| |
| <li> ein gesteuerter Zugriff ist möglich, der immer die selben Ergebnisse zurückliefert</li>
| |
| <li> man kann Singletons ableiten und notfalls gewisse methoden überschreiben (Vererbung)</li>
| |
| <li> gute Alternative zu globale Variablen</li>
| |
| </ul>
| |
| == Nachteile von Singleton ==
| |
| <ul>
| |
| <li> man kann es meist auch anders lösen</li>
| |
| <li> Singleton können sehr unflexibel sein</li>
| |
| <li> durch Singleton kann man leicht verleitet werden, eher prozedual anstatt objektorientiert zu programmieren</li>
| |
| <li> Singletons lassen sich schlecht testen</li>
| |
| </ul>
| |
|
| |
| == Probleme in Flash und ein Lösungsweg ==
| |
|
| |
| In Actionscript ist es leider nicht möglich Konstruktoren auf private zu setzen.<br>
| |
| Aber würde man den Konstruktor einfach public stehen lassen, so drohe eine mögliche Manipulation von Außen.<br>
| |
|
| |
| Mit einem Trick kann man eine gewisse Privatisierung des Konstruktors.<br>
| |
| In diesem Fall passiert das über die interne Klasse SteuerungPrivat, welche nur von Steuerung aus erreichbar ist.<br>
| |
|
| |
|
| |
| == Beispiel der Implementierung in Flash3==
| |
| Für das klassische Singleton wird eine statische Methode implementiert, welche das Objekt erzeugt und zurückgibt.
| |
| <source lang="actionscript3">
| |
|
| |
| 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 {}
| |
| </source>
| |
| 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. <br>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.
| |