singletons, wann machen sie sinn ?
-
miller_m schrieb:
in "foo" werden alle instanzen erstellt.
natürlich könnte man von meinen klassen beliebig viele instanzen machenUm genau das zu verhindern setzt man aber Singletons ein.
Du hast einen Drucker. Auf dem Druckt gerade jemand. Nun darf es nicht passieren das irgendwo ein 2. Druckerobjekt angelegt wird der zwischen den schönen Farbfolien irgendein memorydump ausdruckt.
Soetwas passiert nicht nur aus reiner absicht, soetwas passiert auch sehr schnell aus versehen.
z.B. verwaltet die Klasse eine warteschlange für anstehende Jobs. Irgendwo wurde die Klasse aber Kopiert weil das & gefehlt hat. Nun gibts 2 warteschlangen die sich gegenseitig im wege stehen.
Du kannst einen Singleton bauchen, in diesem Bar1 Bar2 Bar3 anlegen und Dir die Zeiger vom Singleton holen.
Aber so richtig verstanden hab ich das Problem nicht. Das hänht nun mal von der Aufgabenstellung ab ob es sinn macht.
Bedenke aber das Du jetzt schon 3 abhängige Klassen hast und mit einem Singleton die Abhängigkeit vergrössert wird. Bar1 geht dann nur mit SingleTon Bar2 Bar3 ....
Check mal das Design, vllt. erübrigt sich das Problem dann von alleine.
-
Knuddlbaer schrieb:
Aber so richtig verstanden hab ich das Problem nicht. Das hänht nun mal von der Aufgabenstellung ab ob es sinn macht.
...
Check mal das Design, vllt. erübrigt sich das Problem dann von alleine.ein problem ist es nicht, da ich ja nur eine instanz habe und nirgendswo eine andere erzeuge.
war mir nur unsicher ob dies state of art ist oder ob dies wie es bis jetzt gehändelt habe falsch ist. somit hat sich sich für mich die frage gestellt wann den singletons vernünfig eingesetzt werden (dein drucker bsp. ist mir klar)
den ich könnte entweder singletons machen oder irgendwo die klassen instanzieren und dann die pointer verteilen (wie bisher).aber es wird wahrscheinlich auf eine design frage hinaus laufen.
-
miller_m schrieb:
aber es wird wahrscheinlich auf eine design frage hinaus laufen.
Jepp
-
miller_m! Sorry, aber was ist denn jetzt? Dein Designpattern ist einfach falsch. Ein Singlton ist ein offizielles Designpattern, und du hast da oben leider keine Singlton-Klasse definiert.
Bei einem Singlton gehört der Konstruktor (jeder Konstruktor!) private bzw. protected gesetzt. Bei dir kann man jede Klasse so oft instanzieren wie man lustig ist, weil der Konstruktor public ist. Und somit ist es kein Singltton, sondern eine Klasse wie jede andere.
lass Singleton { public: static Singleton* Instance(); protected: Singleton(); Singleton(const Singleton&); Singleton& operator= (const Singleton&); private: static Singleton* pinstance; };
Implementierung:
Singleton* Singleton::pinstance = 0;// initialize pointer Singleton* Singleton::Instance () { if (pinstance == 0) // is it the first call? { pinstance = new Singleton; // create sole instance } return pinstance; // address of sole instance } Singleton::Singleton() { //... perform necessary instance initializations }
Benutzung:
Singleton *p1 = Singleton::Instance(); Singleton *p2 = p1->Instance(); Singleton & ref = * Singleton::Instance();
Du kannst nicht einfach ein Designpattern-Begriff benutzen, aber die Implementierung dann falsch machen.
-
Artchi schrieb:
miller_m! Sorry, aber was ist denn jetzt? Dein Designpattern ist einfach falsch. Ein Singlton ist ein offizielles Designpattern, und du hast da oben leider keine Singlton-Klasse definiert.
Bei einem Singlton gehört der Konstruktor (jeder Konstruktor!) private bzw. protected gesetzt. Bei dir kann man jede Klasse so oft instanzieren wie man lustig ist, weil der Konstruktor public ist. Und somit ist es kein Singltton, sondern eine Klasse wie jede andere.
im obrigen beispiel habe ich keine singletons implementiert ?!?
meine ctor's sind alle public. somit könnte ich diese so oft instanzieren wie ich möchte. auch klar. da ich aber vom design es sogemacht habe das ich wirklich nur eine instanz der klasse habe und auch wirklich nur diese verwende ist es egal ob ich nun richtige singleton's verwende oder ein konsequentes design durchziehe.
-
miller_m schrieb:
im obrigen beispiel habe ich keine singletons implementiert ?!?
meine ctor's sind alle public. somit könnte ich diese so oft instanzieren wie ich möchte. auch klar. da ich aber vom design es sogemacht habe das ich wirklich nur eine instanz der klasse habe und auch wirklich nur diese verwende ist es egal ob ich nun richtige singleton's verwende oder ein konsequentes design durchziehe.
Hast du nicht. Wie von mir bereits gesagt, Singleton ist definiert. Und definierte Begriffe sind da, damit wir uns untereinander verstehen können. Einer sagt: "Ich habe ein Singleton!" und ich weiß, ohne das ich den Code von ihm sehe, wie die Implementierung aussieht!
Du jedoch, hast einfach irgendwas designed und benennst es einfach Singleton. Obwohl es nicht dem Singleton-Designpattern entspricht.
Du solltest deinem Design-Pattern einen anderen Namen geben... z.B. "MillerSingle"-Designpattern. Dann weiß ich das nächste Mal, das du von DEINEM Pattern redest.
Es geht ganz einfach um das Prinzip und das wir im Forum und in der Welt kommunizieren können. Wenn jetzt jeder mit einem eigenen Klassendesign ankommt, und sagt, das ist das SingletonPattern... ich weiß nicht.
-
Artchi schrieb:
Einer sagt: "Ich habe ein Singleton!" und ich weiß, ohne das ich den Code von ihm sehe, wie die Implementierung aussieht!
Singleton ist ein DESIGN Pattern, also kennst du das Design, aber nicht die Implementierung. Die GOF-Implementierung ist zb anders als die von Scott Meyers.
-
Artchi schrieb:
Hast du nicht. Wie von mir bereits gesagt, Singleton ist definiert. Und definierte Begriffe sind da, damit wir uns untereinander verstehen können. Einer sagt: "Ich habe ein Singleton!" und ich weiß, ohne das ich den Code von ihm sehe, wie die Implementierung aussieht!
Du jedoch, hast einfach irgendwas designed und benennst es einfach Singleton. Obwohl es nicht dem Singleton-Designpattern entspricht.
wo habe ich mein desgin als singleton definiert
Artchi schrieb:
Es geht ganz einfach um das Prinzip und das wir im Forum und in der Welt kommunizieren können. Wenn jetzt jeder mit einem eigenen Klassendesign ankommt, und sagt, das ist das SingletonPattern... ich weiß nicht.
ich versteh was du meinst, war mir allerdings nicht bewusst das ich mein design als singleton definiert habe.
mir ging es hauptsächlich darum
miller_m schrieb:
ein problem ist es nicht, da ich ja nur eine instanz habe und nirgendswo eine andere erzeuge.
war mir nur unsicher ob dies state of art ist oder ob dies wie es bis jetzt gehändelt habe falsch ist. somit hat sich sich für mich die frage gestellt wann den singletons vernünfig eingesetzt werden (dein drucker bsp. ist mir klar)
den ich könnte entweder singletons machen oder irgendwo die klassen instanzieren und dann die pointer verteilen (wie bisher).
aber es wird wahrscheinlich auf eine design frage hinaus laufen.
-
Bashar schrieb:
Artchi schrieb:
Einer sagt: "Ich habe ein Singleton!" und ich weiß, ohne das ich den Code von ihm sehe, wie die Implementierung aussieht!
Singleton ist ein DESIGN Pattern, also kennst du das Design, aber nicht die Implementierung. Die GOF-Implementierung ist zb anders als die von Scott Meyers.
Ok, hast Recht, nicht die Implementierung. Aber zumindest was das ganze bewirken soll.
GOF? Was soll das sein? Kannst du mir bitte dazu Infos geben?
-
miller_m schrieb:
wo habe ich mein desgin als singleton definiert
Artchi schrieb:
Es geht ganz einfach um das Prinzip und das wir im Forum und in der Welt kommunizieren können. Wenn jetzt jeder mit einem eigenen Klassendesign ankommt, und sagt, das ist das SingletonPattern... ich weiß nicht.
ich versteh was du meinst, war mir allerdings nicht bewusst das ich mein design als singleton definiert habe.
Ich hab es leider so verstanden. Deshalb war ich widerrum ziemlich verwirrt.
miller_m schrieb:
mir ging es hauptsächlich darum
miller_m schrieb:
ein problem ist es nicht, da ich ja nur eine instanz habe und nirgendswo eine andere erzeuge.
war mir nur unsicher ob dies state of art ist oder ob dies wie es bis jetzt gehändelt habe falsch ist. somit hat sich sich für mich die frage gestellt wann den singletons vernünfig eingesetzt werden (dein drucker bsp. ist mir klar)
den ich könnte entweder singletons machen oder irgendwo die klassen instanzieren und dann die pointer verteilen (wie bisher).
aber es wird wahrscheinlich auf eine design frage hinaus laufen.Ja, und hier verstehe ich leider nicht wirklich was du willst.
Lädiglich der letzte Satz, lässt wieder alles offen, was wieder meine Verwunderung und Verwirrung bestätigt.
Aber wollte dich nicht blöd anmachen.
-
Artchi schrieb:
Ja, und hier verstehe ich leider nicht wirklich was du willst.
Lädiglich der letzte Satz, lässt wieder alles offen, was wieder meine Verwunderung und Verwirrung bestätigt.
ich wollte wissen ob das obrige design so ok ist, und ob vielleicht jemand dieses genau so macht.
oder ob mein ansatz kompletter schrott ist.
oder ob singletons bevorzugt werden.
oder vielleicht was ganz anderes.es hat beides vor- und nachteile finde ich.
meinevar:
vorteil:
- instanzen liegen auf dem stack und ich brauche mir nicht so viel gedanken über das zerstören von objekten zu machen.
nachteil:
- mehr schreibarbeit
- ständig irgendwelche ctor überladen
- aufpassen das ich nicht irgendwo noch ne instanz startesingleton:
vorteil:
- wirklich nur eine instanz
nachteil:
- zerstören vom objekt (ref counting und so nen müll)Artchi schrieb:
Aber wollte dich nicht blöd anmachen.
schade
-
singleton:
vorteil:
- wirklich nur eine instanz
nachteil:
- zerstören vom objekt (ref counting und so nen müll)hö? Schau dir zB. mal die Singleton Implementierung aus Modern C++ Design an (siehe Loki-Library).
-
hast vielleicht nen schönen link dazu ? oder muss ich mir das buch kaufen ?
-
miller_m schrieb:
hast vielleicht nen schönen link dazu ? oder muss ich mir das buch kaufen ?
loki (liegt auf sourceforge)
-
danke, ich schau es mir mal an.