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?
Antwort
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. Veränderlich. Das ist der Schlüssel. – Jayan
@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. –
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 –
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.
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.
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. –
@TimPote Fein. "oft" wurde hinzugefügt. – Bohemian
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.
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
Genau. Entschuldigung, ich habe diese Antwort nicht gesehen, als ich meine gepostet habe, aber ich habe deine Antwort erweitert. –
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.
- 1. Was sind die praktischen Unterschiede zwischen imagick :: INTERLACE_JPEG/INTERLACE_PLANE/INTERLACE_LINE?
- 2. Was sind die praktischen Unterschiede zwischen einer Modulmethode und einer Klassenmethode in Ruby?
- 3. Was sind die Unterschiede zwischen zweien?
- 4. Was sind die Unterschiede zwischen Karma Reportern?
- 5. Was sind die Unterschiede zwischen & und &&, | und || in R?
- 6. Was sind die Unterschiede zwischen PECL und PEAR?
- 7. Was sind die Unterschiede zwischen Active Record und Repository-Muster?
- 8. Graph - Was sind die Unterschiede zwischen eingebetteten und topologischen Graphen?
- 9. Was sind die Unterschiede zwischen C und C++ Aufrufkonventionen?
- 10. Was sind die Unterschiede zwischen Vanille Perl und Strawberry Perl?
- 11. Was sind die Unterschiede zwischen LDAP und Active Directory?
- 12. Was sind die Unterschiede zwischen WCF und traditionellen ASP.NET Web
- 13. Was sind die Unterschiede zwischen Gleitern und Programmierern?
- 14. Was sind die Unterschiede zwischen to.equal (true) und to.be.true?
- 15. Was sind die Unterschiede zwischen WebAPI und WebAPI 2
- 16. Was sind die Unterschiede zwischen HasOne und Referenzen in Nhibernate?
- 17. Was sind die Unterschiede zwischen .pem, .cer und .der?
- 18. Was sind die größten Unterschiede zwischen fopen und curl?
- 19. Was sind die Unterschiede zwischen LLVM und Java-Bytecode?
- 20. Was sind die Unterschiede zwischen flex mxml und actionscript-3?
- 21. Was sind die Unterschiede zwischen ADOdb und PDO in PHP?
- 22. Was sind die Unterschiede zwischen WebServiceBinding.EmitConformanceClaims und WebServiceBinding.ConformanceClaims?
- 23. Was sind die Unterschiede in JIT zwischen Java und. NET
- 24. Was sind die Unterschiede zwischen Pause und Ausfahrt?
- 25. Was sind die Unterschiede zwischen R.styleable, R.style und R.attr?
- 26. Was sind die Unterschiede zwischen struct_time und datetime?
- 27. Was sind die Unterschiede zwischen Layern und erweiterbaren Effekten?
- 28. Was sind die Unterschiede zwischen ConcurrentQueue und BlockingCollection in .Net?
- 29. Was sind die Unterschiede zwischen Entweder und Option?
- 30. Was sind die Unterschiede zwischen Opera Unite und Node.js?
Wenn ich an Singleton denke, denke ich an "globale Variable". Wenn ich an Fliegengewicht denke, denke ich an "Zeiger". – jxh
Sie erreichen nicht dasselbe. – Jayan
Welches "Ding" denken Sie, dass sie erreichen sollen? Die Muster sehen ganz anders aus als ich. – Bergi