Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 06-09-2004, 11:07   #1 (permalink)
nky
Bontempi Punk
 
Benutzerbild von nky
 
Registriert seit: Dec 2001
Ort: Dtld/Pfalz
Beiträge: 4.185
frage zu singleton

Hi

Angeregt Durch MiM`s Blog habe ich mich jetzt mal an Design Patterns gesetzt...

Ok das erste was ich testen will ist Singleton..

Nun habe ich mir eine Klasse Car gemacht...die will ich jetzt testweise als SIngelton instanzieren..

aber nun mein Frage - wie geht das ?

beim instanzieren muss ich doch einen return type angeben...und der ist ja dann nicht von singleton - sondern von car...
ActionScript:
  1. import com.nkylab.designpatterns.*
  2. import com.nkylab.testclasses.*
  3. var a:com.nkylab.testclasses.Car = new Car();
  4. var s1:com.nkylab.designpatterns.Singleton = new Car(); //das hier scheint falsch zu sein
  5.  
Zitat:
**Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 7: Type mismatch in assignment statement: found com.nkylab.testclasses.Car where com.nkylab.designpatterns.Singleton is required.
var s1:com.nkylab.designpatterns.Singleton = new Car();

Total ActionScript Errors: 1 Reported Errors: 1

Gruss nky
nky ist offline   Mit Zitat antworten
Alt 06-09-2004, 11:47   #2 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
Vorsicht singleton macht immer nur dann sinn wenn es absolut nur eine Instanz geben darf. Singleton ist keine patent lösung. hier mal eine kleine demo

PHP-Code:
class Singelton{
    
    private static var 
_instance:Singelton = new Singelton();
    
    private function 
Singelton(){
    }
    
    public function 
eineMethode(){
        
trace("eineMethode");
    }
    
    public static function 
getInstance():Singelton{
        return 
_instance;
    }
}

var 
meineReferenz:Singelton Singelton.getInstance();
meineReferenz.eineMethode(); 
mfg
alex
__________________
TVNEXT Solutions

Geändert von atothek (06-09-2004 um 17:15 Uhr)
atothek ist offline   Mit Zitat antworten
Alt 06-09-2004, 11:50   #3 (permalink)
0x2b | ~0x2b;
 
Benutzerbild von bort
 
Registriert seit: Jan 2003
Ort: Rocky Beach
Beiträge: 370
Du könntest die Car Instanz auf Singleton casten, aber ich glaube es liegt eher an einem Verständnisproblem.

Das Singleton Pattern definiert, dass es von einer Klasse nur eine Instanz geben darf. Eine übliche Implementierung ist, der Klasse, einen privaten Constructor zu geben und eine statische Methode, die die Instanz zurückliefert (eine Instanz einer Singleton-Klasse erhält man in der Regel nicht mit new)

Also z.B.
ActionScript:
  1. class TestSingleton {
  2.   private static var instance;
  3.  
  4.   // Constructor ist private und kann nur von der Klasse
  5.   // selber aufgerufen werden
  6.   private function TestSingleton() {
  7.  
  8.   }
  9.  
  10.   // öffentliche Methode um eine Instanz zu bekommen
  11.   public static function getInstance(Void):TestSingleton {
  12.     if (instance == undefined) instance = new TestSingleton();
  13.     return instance;
  14.   }
  15. }
Über die statische Methode getInstance() bekommst Du dann die (einzige) Instanz zurückgeliefert:
ActionScript:
  1. var test:TestSingleton = TestSingleton.getInstace();
Gruß,
bort.
__________________
http://www.flexperten.de
bort ist offline   Mit Zitat antworten
Alt 06-09-2004, 11:56   #4 (permalink)
nky
Bontempi Punk
 
Benutzerbild von nky
 
Registriert seit: Dec 2001
Ort: Dtld/Pfalz
Beiträge: 4.185
Hi atothek

In der App in der ich es verwenden will - darf es nur eine Instanz geben...deshalb will ich das ja

aber ich versteh eines net...

wie kriege ich meine klasse car jetzt zum singleton ?
muss ich der car noch was dazuerben - oder wie ?

das ist die klasse
ActionScript:
  1. class com.nkylab.testclasses.Car
  2. {
  3.     public function Car()
  4.     {
  5.         trace("car instnaziert")
  6.     }   
  7. }
nky ist offline   Mit Zitat antworten
Alt 06-09-2004, 12:18   #5 (permalink)
MiM
Neuer User
 
Registriert seit: Sep 2001
Ort: Neckarsulm
Beiträge: 273
Du musst den Konstruktor private machen, damit man die Klasse Car von außerhalb nicht mehr instanziieren kann.
Dann gibst du der Klasse Car noch eine statische Methode getInstance():Car. In der Methode getInstance() erstellst du eine neue Instanz von Klasse Car (falls diese noch nicht vorhanden ist), und legst sie in einer statischen Instanzvariable ab.
Also so wie bort das schon gepostet hat.
MiM ist offline   Mit Zitat antworten
Alt 06-09-2004, 12:23   #6 (permalink)
nky
Bontempi Punk
 
Benutzerbild von nky
 
Registriert seit: Dec 2001
Ort: Dtld/Pfalz
Beiträge: 4.185
Hm OK
Dickes Danke an euch alle jetzt ist mir schon vieles klarer !

Nur eines will mir net einluechten..

wozu brauch ich dann eigentlich die Klasse Singleton ? Ich mein alles was ihr mir gezeigt hab - sind quasi Klassen - die alle wie Singletons funktionieren bzw sind..

Ich dachte aber immer man hätte eine klasse a und eine klasse singleton..und um a zu einem singleton zu machen brauche ich beide ..

So wie ich das jetzt aber verstehe -brauche ich nur klasse a....und die bekomtm halt die eigenschaften die man braucht für ein singleton..

Ich denke ich habs bestimmt wieder falsch verstnaden...
aber bevor ich weiter hier rum fasel...probier ich mal ein bisschen aus - futter hab ich ja jetzt genug

Gruss nky
nky ist offline   Mit Zitat antworten
Alt 06-09-2004, 12:40   #7 (permalink)
nky
Bontempi Punk
 
Benutzerbild von nky
 
Registriert seit: Dec 2001
Ort: Dtld/Pfalz
Beiträge: 4.185
ok nach reiflicher überlegung bin ich nun zu folgendem entschluss gekommen
ActionScript:
  1. class com.nkylab.testclasses.Car
  2. {
  3.     private static var instance;
  4.     public function Car()
  5.     {
  6.         trace("car instanziert")
  7.     }   
  8.     public static function getInstance(Void):Car
  9.     {
  10.         if (instance == undefined)
  11.             instance = new Car();
  12.         return instance;
  13.     }
  14. }

somit verfügt die klasse ja über die singleton funktionalität...
ich weiss jetzt ent ob das korrekt ist - aber es entspricht mal dem Beispiel von Bort und ist auch die einleuchtendste Lösung für mich momentan

Aber verbessert mich bitte fals ich die Sache falsch angehe..

Gruss nky
nky ist offline   Mit Zitat antworten
Alt 06-09-2004, 13:40   #8 (permalink)
MiM
Neuer User
 
Registriert seit: Sep 2001
Ort: Neckarsulm
Beiträge: 273
jop, so ist das korrekt.
Du brauchst die Singleton Klasse nicht.
Ein Design Pattern ist ja ein Modell, eine Idee und wird für gewöhnlich an das aktuelle Problem, dass mit Hilfe des Patterns gelöst werden soll, angepasst. Für gewöhnlich lassen sich keine Klassen erstellen, die das Pattern sozusagen repräsentieren, umsetzen und die dann von konkreten Klassen eines Projekts genutzt werden können, bei denen man genau dieses Pattern anwenden möchte.
Hilfestellungen können natürlich trotzdem geboten werden. Zum Beispiel könnte man in seiner Applikation die Instanziierung einem Kontext überlassen. D.h. man registriert Klassen am Kontext mit einem String identifier. Wenn jetzt jemand eine Instanz der Klasse möchte nutzt er Kontext.get("identifier"). Hier könnte man jetzt sagen, dass man bei der Registrierung angeben kann, ob die Klasse ein Singleton sein soll oder nicht. Das ist auch das Thema, dass ich auf meinem Blog angeschnitten habe.
Proxies könnte man mit Hilfe von AOP auch dynamisch erzeugen lassen.
MiM ist offline   Mit Zitat antworten
Alt 06-09-2004, 13:46   #9 (permalink)
nky
Bontempi Punk
 
Benutzerbild von nky
 
Registriert seit: Dec 2001
Ort: Dtld/Pfalz
Beiträge: 4.185
Ist das schön wenn langsam die Einsicht kommt...Ich muss sagen ich hatte ein völlig falsches Bild von der ganzen Sache....Danke für die Aufklärung !
Langsam macht es mir einen Höllen Spass

Nun noch ein Frage:
Warum muss die InstanceVar und die getInstance Methode statisch sein ?

Wenn ich das statisch rausmache - motzt der compiler ...

Gruss nky
nky ist offline   Mit Zitat antworten
Alt 06-09-2004, 13:58   #10 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
@Simon:
Die Geschichte mit dem Kontext finde ich interessant. Ich finde es nämlich sehr nervig, wenn ich jeder Klasse, die ich als Singleton benutzen möchte, die gleiche getInstance Routine und instance-Eigenschaft geben muss.

Wenn ich die Singleton-Eigenschaft einer Klasse durch eine Kontext verwalte, wie vermeide ich dann, dass die Klasse direkt instantiiert wird?
Und am Casten kommt man wohl auch nicht vorbei, oder? Der Kontext kann ja nur Object liefern.

mfg .r
bokel ist offline   Mit Zitat antworten
Alt 06-09-2004, 14:47   #11 (permalink)
MiM
Neuer User
 
Registriert seit: Sep 2001
Ort: Neckarsulm
Beiträge: 273
Auf http://www.simonwacker.com/blog/archives/000079.php wird das ganze nochmal genauer beleuchtet. Ich bin gerade auch dabei alle Vorankündigungen, Ideen, die ich dort genannt habe umzusetzen.

Am Casten wirst du leider nicht vorbeikommen und Kontrolle über die Häufigkeit Instanziierung der Klasse hat man leider auch nicht. Das ganze setzt also wieder ein wenig Disziplin voraus, wobei das ja eigentlich kein größeres Problem sein sollte und weicht auch leicht von der Singleton Definition im GoF Buch ab (mehr in oben genanntem Artikel).

Ein Kontext eröffnet auch noch eine Reihe anderer Möglichkeiten. Zum Beispiel könnte man auf deklarativer Basis die Beziehungen zwischen einzelnen Instanzen etc. bestimmen (Inversion of Control).
Von Spring wird das in einer wirklich schönen Weise unterstützt.
MiM ist offline   Mit Zitat antworten
Alt 06-09-2004, 15:15   #12 (permalink)
thinkin aBout tha lib.
 
Benutzerbild von kaneda
 
Registriert seit: Nov 2001
Ort: Kölle
Beiträge: 1.379
Hmm

Also so wie ich macromedia kenne kann man casten auch einfach weglassen ...

<sarkasmus>
AS2 ist ja so schön typisiert
</sarkasmus>
__________________
Back to community with http://leichtgewicht.at
kaneda ist offline   Mit Zitat antworten
Alt 06-09-2004, 15:18   #13 (permalink)
nky
Bontempi Punk
 
Benutzerbild von nky
 
Registriert seit: Dec 2001
Ort: Dtld/Pfalz
Beiträge: 4.185
ihr ollen Fachsimpler

Zitat:
Nun noch ein Frage:
Warum muss die InstanceVar und die getInstance Methode statisch sein ?
Gruss nky
nky ist offline   Mit Zitat antworten
Alt 06-09-2004, 15:26   #14 (permalink)
\x3a\x6f\x29
 
Benutzerbild von [je]
 
Registriert seit: Apr 2004
Ort: paris
Beiträge: 806
Ich hab zu dem ganzen auch mal eine Frage )
Wozu oder besser wann braucht man sowas?
__________________
joa ebert
http://blog.joa-ebert.com/ - http://www.joa-ebert.com/
[je] ist offline   Mit Zitat antworten
Alt 06-09-2004, 15:28   #15 (permalink)
nky
Bontempi Punk
 
Benutzerbild von nky
 
Registriert seit: Dec 2001
Ort: Dtld/Pfalz
Beiträge: 4.185
wenn du eine klasse hast und willst sicherstellen das von ihr nur eine instanz vorhanden ist.....bzw nur eine instanz erstellt werden kann..
(hast dir mal die kommentare von mim durchgelesen ) ?

Gruss nky
nky 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 15:27 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele