• SpryFlashCMS das Flash CMS
  • TWUMBLE - bald online
  • Adobe User Group
Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 13-06-2004, 17:04   #1 (Permalink)
Neuer User
 
Registriert seit: Jun 2004
Ort: Aachen
Beiträge: 30
Design Pattern Singleton

Holla,

In Bokels Blog Archiv habe ich das gefunden....
http://www.helpqlodhelp.com/blog/archives/2003_09.html
AS7: Executing once

Geht darum, wie man Instanzen erzeugen kann wenn die Klasse deklariert wird. Diese Technik kann man wunderbar mit dem Singleton Pattern verbinden.

Beim Singleton Pattern gibt es nur eine Instanz - also kann man diese Instanz auch zur Deklarationszeit erzeugen.

Aus Gof Intent für ein Singleton:
"Ensure a class only has one instance, and provide a global point of access to it"

Prima Beispiel ist eine Klasse, die Konfigurationen einer Applikation speichert.
Die Klasse unten benutzt dafür einen Hashtable.
http://java.sun.com/j2se/1.3/docs/ap...Hashtable.html

Singleton ist super praktisch aus vielen Gründen... vorallem aber der globale
Einsprungspunkt.

Wers nicht kennt - unbedingt anschauen

Viele Grüße, Nico.

PHP-Code:
/**
 * Preferences Singleton
 * Keeper of the Preferences within a project
 * <code>
 * var prefs : Preferences = Preferences.getInstance();
 * prefs.setPropery ("language", "DE");
 * prefs.setPropery ("someInt", 5);
 * [...]
 * //somewhere in your project...
 * var lang = Preferences.getInstance().getPropery("language");
 * </code>
 */
import somePackage.HashTable;
import somePackage.Enumeration;

class 
Preferences {
    
    private var 
props HashTable;
    
    
//create instance when class is declared
    
private static var instance = new Preferences();
    
    
/**
     * get the Preferences Instance
     * @return instance of Preferences
     */
    
public static getInstance() : Preferences {
        return 
instance;
    };

    
/**
     * private constructor
     * get instance by getInstance
     */
    
private function Preferences() {
        
props = new HashTable();
    };
    
    
/**
     * set a Propery
     * @param name of the property
     * @param value of the propery, no special type
     * @return null if prop wasn't set before, oldvalue if prop was set before
     */
    
public function setProperty (name Stringvalue) {
        return 
props.put (namevalue);
    };
    
    
/**
     * get a property
     * @param name of the propery
     * @return value of the propery or null
     */
    
public function getProperty (name String) {
        return 
props.get(name);
    };
    
    
/**
     * check existance of a property
     * @param name of the propery
     * @return boolean property exists
     */
    
public function hasProperty (name String) : Boolean {
        return 
props.containsKey(name);
    };

    
/**
     * @return names of all props as Enumeration
     */
    
public function getPropertyKeys() : Enumeration {
        return 
props.keys();
    };


}; 
Nico Zimmermann ist offline   Mit Zitat antworten
Alt 13-06-2004, 17:44   #2 (Permalink)
MiM
Neuer User
 
Registriert seit: Sep 2001
Ort: Neckarsulm
Beiträge: 273
Zum Thema Singleton in Flash hat auch Dave Yang vor nicht so langer Zeit was auf seinem Weblog geschrieben. Unterscheidet sich aber nur geringfügig von deiner Implementation.
Dave Yang: Singleton
In manchen Fällen ist es jedoch schöner, ein Singleton-Dasein einer Klasse über eine Factory zu Regeln. Also das die Factory entscheidet ob eine Klasse ein Singleton sein soll oder eben nicht. Natürlich könnten bei dieser Implementation auch noch andere Instanzen des 'Singletons' irgendwo rumschwirren. Ist also nicht einsetzbar wenn man ein absolutes Singleton benötigt.
Was in diesem Zusammenhang auch immer schön zu benutzen ist sind 'Kontexte'. Das bedeutet man registriert eine Klasse mit einem String in einem Kontext und eine Instanz erhält man dann über den speziellen Kontext + den String. Und die ganze Registrierung (welche Klasse zu welchem String) dann noch gesteuert über ne außenstehende Text/XML-Datei or what ever.
Ich guck mal ob ich sowas in der Art in ner folgenden as2lib Version mit reinpack.
MiM ist offline   Mit Zitat antworten
Alt 13-06-2004, 18:08   #3 (Permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Wenn ich es mir recht überlege braucht man Singletons ja eigentlich nur, wenn man mehrere davon haben will. Eigentlich ein Widerspruch in sich Ansonsten könnte man ja einfach eine Klasse mit statischen Methoden benutzen, oder?

mfg. r
bokel ist offline   Mit Zitat antworten
Alt 13-06-2004, 18:43   #4 (Permalink)
MiM
Neuer User
 
Registriert seit: Sep 2001
Ort: Neckarsulm
Beiträge: 273
Wenn man absolute Singletons nimmt dann jein, wobei ich sagen muss, dass ich mal ähnlicher Auffassung war.
Ich persönlich mag es immer mit Instanzen zu arbeiten. Was bei einer Klasse mit nur statischen Methoden etc. auch wegfallen würde wäre die Initialisierung im Konstruktor. Man könnte dies natürlich auch irgendwie bei statischen Methoden hinbiegen, dass es auch so eine Art Initialisierung gibt, was aber auch nicht wirklich elegant wäre.
Falls man 'Singletons' (so wie in meinem letzten Post geschrieben) durch einen Kontext bzw. eine Factory realisiert, dann stehn einem sozusagen beide Möglichkeiten offen. Also absolutes Singleton oder doch irgendwo noch ne zweite oder dritte Instanz von der 'Singleton' Klasse. In diesem Fall könnte man es nicht durch statische Methoden regeln.
Wobei es in dieser kompromissreichen Singleton Implementation eine Glaubensfrage ist, ob es nun ein Singleton ist oder nicht.
MiM ist offline   Mit Zitat antworten
Alt 13-06-2004, 19:00   #5 (Permalink)
www.kruesch.de
 
Benutzerbild von flory
 
Registriert seit: Feb 2002
Beiträge: 1.057
Preferences ist ein sehr sinnvoller Einsatz für ein Singleton. Wenn man es mit
einer Factory löst, kann man das Objekt erst bei Bedarf erzeugen, und dann
immer wieder rausreichen, falls bereits existiert.
Ich denke auch, der Punkt ist die Initialisierung - wenn die benötigt wird, sollte
man sie bei der Instanzierung im Konstruktor durchführen.
Statische Initialisierung á la Dave Yang geht natürlich auch, aber u.U. kann das für die
Performance ungünstig sein, weil sie sofort ausgeführt wird.
__________________
www.planet-xaml.net

Geändert von flory (14-06-2004 um 09:06 Uhr)
flory ist offline   Mit Zitat antworten
Alt 13-06-2004, 19:12   #6 (Permalink)
MiM
Neuer User
 
Registriert seit: Sep 2001
Ort: Neckarsulm
Beiträge: 273
Mir ist gerade noch zwei wichtige Punkte eingefallen warum man Singletons nicht durch statisch Methoden regeln sollte.
1. Man kann keine Interfaces benutzen.
2. Vererbung geht natürlich auch nicht.
MiM ist offline   Mit Zitat antworten
Alt 13-06-2004, 20:14   #7 (Permalink)
Neuer User
 
Registriert seit: Jun 2004
Ort: Aachen
Beiträge: 30
>Mir ist gerade noch zwei wichtige Punkte eingefallen warum man Singletons nicht durch statisch Methoden regeln sollte.

... kein "this" statement...

Das mit der Factory finde ich interessant.. hast Du da Quellen ?

>Wenn ich es mir recht überlege braucht man Singletons ja eigentlich nur, wenn man mehrere davon haben will. Eigentlich ein Widerspruch in sich Ansonsten könnte man ja einfach eine Klasse mit statischen Methoden benutzen, oder?

Gibt ja noch das "Multiton" ... da könnte man instances als Hash oder Array/ Vector angeben. Sinnvoll z.B. wenn man in einer Multiuserumgebung eine Nachricht an alle User schicken möchte. Die Userthread-Klasse enthält dann ein Array "instances"...
...for (e = UserThread.getInstances().getEnumeration ...) [schick Nachricht]...
Nico Zimmermann ist offline   Mit Zitat antworten
Alt 13-06-2004, 20:14   #8 (Permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Gute Gründe und zusätzlich vermeiden wir damit einen Sonderfall,
also doch lieber Instanz als statische Klasse

danke r.
bokel ist offline   Mit Zitat antworten
Alt 13-06-2004, 20:26   #9 (Permalink)
Neuer User
 
Registriert seit: Jun 2004
Ort: Aachen
Beiträge: 30
Hey MiM!

Simon das bist ja Du! Denke die HashMap der AS2Lib funktioniert der o.g. Umgebung prima!

Noch eine kleine Info... Ich arbeite gerade an einem Eclipse Plugin, dass die Features von SOS in Eclipse bietet. Soweit läuft alles ganz gut...aber die SWT Controls von Eclipse machen mir zu schaffen... Ich bekomme keine direkte Steuerung von dem TextViewer zum Scrollbar... leider bin ich aber ab morgen im Urlaub und kann daran nicht weiterarbeiten... naja Urlaub ich auch schön

Ich würde dieses Projekt auch gerne als open-Source durchführen, habe aber die Befürchtung, dass die Organisation mehr Arbeit macht als das Projekt selbst. Stellt SourceForge einen CVS Server pro Projekt zur Verfügung ? Das würde es ja schon deutlich vereinfachen...

lg, Nico.
Nico Zimmermann ist offline   Mit Zitat antworten
Alt 14-06-2004, 07:47   #10 (Permalink)
thinkin aBout tha lib.
 
Benutzerbild von kaneda
 
Registriert seit: Nov 2001
Ort: Kölle
Beiträge: 1.379
hmm

Zitat:
>Mir ist gerade noch zwei wichtige Punkte eingefallen warum man Singletons nicht durch statisch Methoden regeln sollte.

... kein "this" statement...
klar gibts das ...

Code:
static function do() {
  var that = eval("th"+"is");
}
Jop man krieg pro Projekt einen CVS Server. Man muss sich auch nicht organisation aufhalsen, man kann auch einfach nur veröffentlichen.

Ich weiss nicht obs zum Thema "Singleton" passt... ich hab letzens für ein grossflächiges Refactoring rund um einen bitterbösen Bug ein bischen etwas anderes gemacht, das im Endeffekt vielleicht nicht so das schönste war aber in meinem Fall die einfachste schnellste und doch recht saubere Lösung. Das ganze auch noch in JavaScript *urgs*

und zwar hab ich die selben methoden zusätzlich(was ja in einer anständigen OOP Sprache nicht exisitert) statisch angelegt wie sie vorher public verfügbar waren. Dazu hab ich eine Mehtode geschrieben die instanzen der Klasse anhand eines parameters anlegt... so irgendwie:

Code:
MyClass = function(win) {
  this.win = win;
}
o = MyClass.prototype;
p = MyClass;
p.instances = new Array();
p.initialize = function(win) {
  this.instances[this.instances.length] = new this(win);
}
p.doSomething = function() {
  for(var i=0; i<this.instances.length; i++) {
     this.instances[i].doSomething();
  }
}
o.doSomething = function() {
  //... usw.
}
Das war ein recht grosses refactoring. Ich habe (wie man vielleicht merkt) vorher statische methoden verwendet. (Zugegeben es ist eine hässliche methode aber sie funktioniert momentan ganz gut und ist schnell(was wichtig ist), kritik ist nicht erlaubt, schliesslich würde ich es jetzt nicht mehr so schreiben.)

Hätte ich gleich von anfang an Singletons verwendet so wäre das nicht in ganz so viel Arbeit ausgeartet beim umbauen und ich hätte einfach einen broadcaster dazwischenschalten können.

nunja. just my 2 cents.
__________________
Back to community with http://leichtgewicht.at
kaneda ist offline   Mit Zitat antworten
Alt 14-06-2004, 12:41   #11 (Permalink)
MiM
Neuer User
 
Registriert seit: Sep 2001
Ort: Neckarsulm
Beiträge: 273
@Nico Zimmermann: Quellen hab ich gerade so aus dem Stehgreif nicht. Ich bin bei der Arbeit mit J2EE draufgestoßen. Da wird das so in der Art gemacht weil statische Vars laut Spezifikation, auf die Weise wie man sie zur Umsetzung eines Singletons braucht, nicht erlaubt sind. Wenn ich daheim bin dann werd ich kurz ein paar Referenzen raussuchen und hier posten.
@Kaneda: Das this gibt es schon, aber schön ist eval("th" + "is") ja nicht gerade.

Geändert von MiM (14-06-2004 um 12:42 Uhr)
MiM ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2010 Marc Thiele und Sascha Wolter.