2009-08-08 9 views
1

Ich arbeite an einem Projekt, wo ich viele Klassen habe, die sich auf meine GUI beziehen (hauptsächlich die Panels, aber manchmal auch den Frame selbst). Also dachte ich mir, dass ich statt des Frame als Argument für jeden Konstruktor Getter in jeder Klasse erstellen würde, würde ich eine Singleton-Instanz des JFrame machen, so dass alle Klassen stattdessen darauf zugreifen. Ist das ein guter Ansatz oder wird es meine Faulheit irgendwie bestrafen?Wäre eine Singleton-GUI in diesem Fall gut?

Edit: Ich bin nicht nur faul, ich versuche hier in Modellen zu denken: Zum Beispiel, sagen wir, ich verschiedene Auto-Objekte und die Straße ist meine GUI haben. Alle Autos sollten Zugang zu derselben Straße haben, und die Straße ist kein Teil eines Autos.

+0

Wenn Sie jemals Schnittstelle verwendet werden soll ' richtig 'mit Mac OS wird das nicht funktionieren. Ihre HID-Richtlinien geben an, dass es eine Menüoption "neues Fenster" geben soll. Außerdem gibt es ein Windows-Menü, das die Auswahl aller geöffneten Fenster ermöglicht. Wenn Sie versuchen, jedes neue Fenster als einen neuen Java-Prozess auszuführen, müssten Sie das Windows-Menü in obj-c schreiben oder rcp verwenden, da der jvm Fensterreferenzen über jvms nicht ohne weiteres freigeben kann (Sie können also toFront nicht aufrufen)()) – KitsuneYMG

Antwort

1

Ein besserer Ansatz wäre es, den Haupt-JFrame hinter statischen Methoden zu verstecken, aber im Allgemeinen ist es eine gute Idee, wenn Sie nur ein JFrame-Objekt für das gesamte Programm sowieso es statisch zu machen.

es hinter statischen Methoden Hiding wird sichergestellt, dass, wenn Sie mit jemandem daran arbeiten sonst können Sie einschränken, was Sie wollen sie in der Lage sein, auf dem Haupt-JFrame zuzugreifen, würden aber für so etwas wie ein Schulprojekt nutzlos usw.

+0

Es ist nicht für ein Schulprojekt, es ist einfach ein paar Spiele und Experimente, die ich für mich mache. –

+1

Dann glaube ich nicht, dass mit einem statischen JFrame-Objekt etwas nicht in Ordnung ist. Würde verhindern, dass Sie Zeiger herumreichen müssen. – user142350

2

Es gibt viele Meinungen in der Gegend, siehe referenziertes Material unten.

Mein Gefühl ist, dass wir versuchen sollten, Singletons zu vermeiden, weil "es gibt keine solche Nummer wie 1".

[Dies folgt aus meiner Theorie, dass "es keine solche Zahl wie 2 gibt". Wenn Sie Code haben, der zwei von etwas erlaubt, und nur zwei von etwas, dann haben Sie einen Trick verpasst - es gibt fast sicher mehr als zwei, stattdessen lösen Sie, wie man mit "vielen" umgeht Die "keine Zahl wie 1 Argument" ist, dass gerade, wenn Sie dachten, es könnte nur eines von etwas gibt es gibt einen Kontext, in dem es möglich ist, mehr zu haben ... und es ist in der Regel sehr wenig zusätzliche Arbeit, um mehr zu ermöglichen.

Sieh dir dein Beispiel an ... Ich habe verschiedene Autoobjekte, alle haben Zugang zur selben Straße? Klingt das wie ein Modell einer realistischen Welt? UK Roads und French Roads, kein Unterschied? ;-) Warum diese "Nur eine" Annahme in deinen Code einbauen?

Verwendung von Fabriken und Abhängigkeitsinjektion dieser Fabriken wird oft die bessere Antwort sein. Viel mehr Material in Antworten zu diesem question.

+0

Hehe, Entschuldigung für das miese Beispiel :) Es ist nicht so, dass ich die Instanz beschränken möchte, das Problem ist, dass ich eine einfache Referenz für alle Klassen haben möchte, damit sie funktioniert und meinen Code anständig aussehen lässt. Ich möchte upvote, aber ich bin immer noch knapp an Punkten, also möchte ich mich bei allen bedanken, die bisher geantwortet haben. –

+0

Nicht nur dein Beispiel, es ist erstaunlich, wie oft etwas wie ein Singleton aussieht und dann nicht mehr eins ist. Die einfachen Referenzen können von eingespritzten Fabriken kommen. Siehe die Referenzen. – djna

2

Das Singleton-Muster gilt heute als "Anti-Pattern". Das Problem wird sich zeigen, wenn Ihre Autos eines Tages mit einer anderen Straße gefahren werden müssen.

Es wird noch deutlicher, wenn Sie sich entscheiden, die Autos für sich selbst zu testen. Wenn du einen Mock für die Straße nicht zur Verfügung stellen kannst, wie wirst du sie testen? Und Sie werden es nicht können, da sie sich auf ihren Weg durch einen Singleton beziehen.

(Offensichtlich gibt es eine Abhilfe durch die Singleton ein MockRoad wenn in „Test-Modus“ zurückkehren zu müssen, aber das bedeutet nur, du bist Test Code in Ihre Produktion Code hinzufügen.)

Verwandte Themen