2013-05-25 9 views
13

Das zwei Muster scheint das gleiche zu erreichen. Was sind die verschiedenen Anwendungsfälle in der realen Welt? DankWas sind die praktischen Unterschiede zwischen Fliegengewicht und Singleton-Mustern?

+2

Wenn ich an Singleton denke, denke ich an "globale Variable". Wenn ich an Fliegengewicht denke, denke ich an "Zeiger". – jxh

+0

Sie erreichen nicht dasselbe. – Jayan

+0

Welches "Ding" denken Sie, dass sie erreichen sollen? Die Muster sehen ganz anders aus als ich. – Bergi

Antwort

12

Ein Singleton ist oft veränderbar. Das ist mit einem Fliegengewicht nicht möglich. Z.B. ein Fliegengewicht könnte eine Farbe darstellen. Es wäre verwirrend, wenn Sie eine rote Farbe erstellen würden und stattdessen grün, weil das darunterliegende Fliegengewicht-Objekt irgendwo anders im Code grün wurde.

Auch ich würde sagen, ein Singleton ist eine Art Subpattern von Fliegengewicht. Sie könnten sich die einzelnen Farbobjekte als Singletons vorstellen, aber sie sind alle Teil eines Systems, in dem Sie eine Factory verwenden, um das richtige Singleton/Flyweight-Objekt auszuwählen.

Es ist wirklich viel über die Wahrnehmung. Flyweights werden dem Benutzer der API nicht so präsentiert, als wären sie eindeutige Objekte, während Singletons dies sind.

Beispiele aus Kakao (Objective-C):

UIApplication.sharedApplication.statusBarHidden = YES 

Das ist natürlich ein einzelnes Objekt und Sie können ihren Zustand ändern.

UIColor *red = [UIColor redColor] 

Der Benutzer muss nicht wissen, ob Rot ein Singleton ist oder nicht, weil es unveränderlich ist. Sie können Farbobjekte nicht ändern, nachdem sie erstellt wurden. Es macht also keinen praktischen Unterschied für den Benutzer, ob es sich um Singletons oder um neue Objekte handelt. Daher ist es sinnvoller, dies ein Fliegengewicht zu nennen. Es geht nur um die Absicht.

+1

+1. Veränderlich. Das ist der Schlüssel. – Jayan

+0

@Jayan Wie ist der Mutabilitätsschlüssel? Ich habe viele Singletons gesehen und gemacht, die unveränderlich sind. Zum Beispiel Fabriken oder Eigentumscontainer. Dies ist eine gute Antwort, und das mag eine faire Faustregel sein, aber es gibt viele Gründe, einen unveränderlichen Singleton zu verwenden. –

+0

Wenn Sie die Erklärung von Fliegengewicht auf Wikipedia lesen, ist die Beschreibung sehr sehr unterschiedlich zu dem, was Sie hier beschreiben. IMO, sie sind völlig unabhängig voneinander. http://en.wikipedia.org/wiki/Flyweight_pattern –

11

Fliegengewicht ist, wenn Sie viele verschiedene Arten von einer einzigen Sache haben.

Singleton ist, wenn Sie eine einzige Sache haben.

Zum Beispiel könnten Sie das Flyweight-Muster verwenden, um Tastaturzeichen darzustellen. Ein Objekt für a, eins für b, etc. Sie sind beide Zeichen, aber verschiedene Arten von Zeichen.

Im Gegensatz dazu könnten Sie ein Singleton zur Darstellung der Tastatur verwenden. Da kann nur einer sein.

4

Sie sind nicht verwandt:

Flyweight (natürlich unveränderlich) Instanzen einer Klasse, wo immer möglich ist, die Wiederverwendung, statt neue Instanzen einer Klasse mit dem gleichen „Wert“ zu schaffen, die CPU und Speicher spart.

Singleton ist, wenn es immer nur eine Instanz einer (normalerweise veränderlichen) Klasse gibt. Es wird häufig in Multithread-Umgebungen verwendet, um allen Threads, die eine einzelne Instanz verwenden und denselben Zustand "sehen" können, zu erleichtern.

+0

Whoa, whoa, whoa. Zu sagen "es ist * oft * benutzt" und "es wird benutzt" sind zwei völlig verschiedene Dinge. Neben dem Threading gibt es viele Gründe, ein Singleton zu verwenden. Zum Beispiel für eine teure Operation, die nur einmal ausgeführt werden soll. –

+0

@TimPote Fein. "oft" wurde hinzugefügt. – Bohemian

2

Das Fliegengewicht wird verwendet, wenn eine klare Trennung des intrinsischen und extrinsischen Zustands des Objekts existiert. Der intrinsische Zustand kann auf andere extrinsische Objekte aufgeteilt werden. Zum Beispiel kann eine Kopfzeile der Dokumente als intrinsischer Zustand des Objekts klassifiziert werden und kann übergreifend geteilt werden. Der Rest der Daten im Dokument kann jedoch sehr dynamisch sein und vom Benutzer ausgefüllt werden (extrinsische Daten). Zur Darstellung intrinsischer Daten kann ein Fliegengewicht-Objekt innerhalb der Fliegengewicht-Fabrik erstellt und gepflegt werden. Das Flyweight-Factory-Objekt dient als Sammlung von Flyweight (Header-Objekten) und kann in unserem Fall früher ausgefüllt und über verschiedene Instanzen des Dokuments verteilt werden.

1

Vergessen Sie nicht, dass Singleton ein kreatives Muster ist, während das Fliegengewicht ein strukturelles Muster ist. Daher ist das Ziel der beiden Muster völlig unterschiedlich

+0

Genau. Entschuldigung, ich habe diese Antwort nicht gesehen, als ich meine gepostet habe, aber ich habe deine Antwort erweitert. –

0

Sie sind zwei völlig verschiedene "Muster Typen". Singleton ist ein "CREATION" -Muster. Erstellungsmuster sind gängige "Objekterstellungs" -Methoden höherer Ordnung. Auf der anderen Seite ist Fliegengewicht ein "Strukturelles Muster". Strukturelle Muster müssen mehr mit Schnittstellen und Implementierung als mit der "Objekterstellung" zu tun haben. Eine weitere einfachere Möglichkeit, die Unterschiede zu beschreiben, ist der erste Mustertyp "Creation Patterns", der mehr auf Nomen basiert. Die zweiten "Strukturmuster" -Typen sind mehr Verb-basiert.

Verwandte Themen