Singleton
Verfasst: Freitag 21. November 2008, 21:54
Gesetzt folgender Fall:
Ich habe drei Klassen A, B und C. Jede davon nimmt eine Aufgabe komplett wahr und braucht nur noch genutzt zu werden. Keine dieser Klassen darf mehr als eine Instanz besitzen.
Konkret wäre ein Beispiel für sowas eine Art "FileSystem" Klasse, die intern alle eingelesen Pfade / Filenames speichert und damit umzugehen weiß. Natürlich darf es keine zwei FileSystem Instanzen geben, schließlich gibts auch nur ein FileSystem.
Klasse B und C brauchen nun beide die Instanz der Klasse A, die wiederrum selbst zentral von einer Art "Main" Modul instanziert wurde.
Mein Gedankengang bzw meine Idee zur Lösung:
Ich mache Klasse A zu einem Singleton. B und C importieren das Modul, in dem die Klasse definiert wurde, und versuchen sie zu inittieren. Dadurch bekommen beide die Instanz, die vorher vom Main Modul angelegt wurde. Funktionieren sollte das, da ein Modul ja nicht mehrmal importiert, sondern nach dem ersten Import in sys.modules angefragt wird.
--> B und C können A ohne weitere Probleme nutzen.
Frage: Ist das sauber / gut / was auch immer?
Vorteile sehe ich darin, das diese Klassen sowieso nur einmal instanziert werden können. Ich habe einen definierten Einstiegpunkt (Die Klasse selbst).
Es ist auch gut nachvollziehbar. Nach dem Starten des Programmes wird die Instanz genau einmal instanziert, im Main Modul. Wird sie danach wieder benutzt, brauche ich mich um nichts zu kümmern.
Die Kapselung bleibt gewahrt. Statt im Main Modul mit einer globalen Variable zu hantieren, bleibt die Instanz und Logik bei der Klasse.
Würde ich es nicht so umsetzen, hätte ich eine riesige Anlaufstelle im "Main Modul". Das bringt in "niederen" Hierarchien automatisch Probleme mit, da Main neben dem reinem Initiieren auch eine Art "Mainloop" beinhalten müsste, und ich alles, was passiert, bis in die unteren Hierarchien weitergeben müsste.
Nachteile:
Das ist eine Art global, ja. Aber: Solang ich nur "Read-Only" auf solche Systeme zugreife (was ja der Sinn und Zweck ist), sollte es keine Probleme geben.
Ich habe drei Klassen A, B und C. Jede davon nimmt eine Aufgabe komplett wahr und braucht nur noch genutzt zu werden. Keine dieser Klassen darf mehr als eine Instanz besitzen.
Konkret wäre ein Beispiel für sowas eine Art "FileSystem" Klasse, die intern alle eingelesen Pfade / Filenames speichert und damit umzugehen weiß. Natürlich darf es keine zwei FileSystem Instanzen geben, schließlich gibts auch nur ein FileSystem.
Klasse B und C brauchen nun beide die Instanz der Klasse A, die wiederrum selbst zentral von einer Art "Main" Modul instanziert wurde.
Mein Gedankengang bzw meine Idee zur Lösung:
Ich mache Klasse A zu einem Singleton. B und C importieren das Modul, in dem die Klasse definiert wurde, und versuchen sie zu inittieren. Dadurch bekommen beide die Instanz, die vorher vom Main Modul angelegt wurde. Funktionieren sollte das, da ein Modul ja nicht mehrmal importiert, sondern nach dem ersten Import in sys.modules angefragt wird.
--> B und C können A ohne weitere Probleme nutzen.
Frage: Ist das sauber / gut / was auch immer?
Vorteile sehe ich darin, das diese Klassen sowieso nur einmal instanziert werden können. Ich habe einen definierten Einstiegpunkt (Die Klasse selbst).
Es ist auch gut nachvollziehbar. Nach dem Starten des Programmes wird die Instanz genau einmal instanziert, im Main Modul. Wird sie danach wieder benutzt, brauche ich mich um nichts zu kümmern.
Die Kapselung bleibt gewahrt. Statt im Main Modul mit einer globalen Variable zu hantieren, bleibt die Instanz und Logik bei der Klasse.
Würde ich es nicht so umsetzen, hätte ich eine riesige Anlaufstelle im "Main Modul". Das bringt in "niederen" Hierarchien automatisch Probleme mit, da Main neben dem reinem Initiieren auch eine Art "Mainloop" beinhalten müsste, und ich alles, was passiert, bis in die unteren Hierarchien weitergeben müsste.
Nachteile:
Das ist eine Art global, ja. Aber: Solang ich nur "Read-Only" auf solche Systeme zugreife (was ja der Sinn und Zweck ist), sollte es keine Probleme geben.