suchen
HeimWeb-Frontendjs-TutorialDetaillierte Interpretation des Flyweight-Musters in der JavaScript-Designmusterprogrammierung

Das Flyweight-Muster eignet sich am besten zur Lösung von Leistungsproblemen, die durch die Erstellung einer großen Anzahl ähnlicher Objekte entstehen. In diesem Artikel wird die Verwendung des Flyweight-Musters in der JavaScript-Entwurfsmusterprogrammierung zusammengefasst, einschließlich Beispielen für die Verwendung bei DOM-Operationen:

Das Fliegengewichtsmuster unterscheidet sich vom allgemeinen Entwurfsmuster. Es wird hauptsächlich zur Optimierung der Leistung des Programms verwendet. Es eignet sich am besten zur Lösung von Leistungsproblemen, die durch eine große Anzahl ähnlicher Objekte verursacht werden. Der Flyweight-Modus verbessert die Anwendungsleistung, indem er Anwendungsobjekte analysiert und sie in intrinsische Daten und extrinsische Daten analysiert, wodurch die Anzahl der Objekte reduziert wird.

Grundkenntnisse

Der Fliegengewichtsmodus reduziert die Anzahl der Objekte durch die gemeinsame Nutzung einer großen Anzahl feinkörniger Objekte, wodurch der Objektspeicher reduziert und die Anwendungsleistung verbessert wird. Die Grundidee besteht darin, die Komponenten vorhandener ähnlicher Objekte zu zerlegen und sie in gemeinsam nutzbare intrinsische Daten und nicht gemeinsam nutzbare extrinsische Daten zu erweitern. Wir nennen die Objekte intrinsischer Daten Fliegengewichtsobjekte. Normalerweise wird auch eine Factory-Klasse benötigt, um interne Daten zu verwalten.
In JS besteht das Flyweight-Muster hauptsächlich aus den folgenden Rollen:
(1) Client: eine Klasse, die zum Aufrufen der Flyweight-Fabrik verwendet wird, um intrinsische Daten zu erhalten, normalerweise die von der Anwendung benötigten Objekte,
(2 ) Fliegengewichtsfabrik: eine Klasse zur Verwaltung von Fliegengewichtsdaten
(3) Fliegengewichtsklasse: eine Klasse zur Verwaltung interner Daten

Implementierung und Anwendung von Fliegengewichtsmustern

Allgemeine Implementierung

Nehmen wir zur Veranschaulichung ein Beispiel: Apple produziert iPhones in Massenproduktion. Die meisten iPhone-Daten wie Modell und Bildschirm sind gleich, einige Teile der Daten sind jedoch identisch Der Speicher ist beispielsweise in 16 GB, 32 GB usw. unterteilt. Bevor wir den Fliegengewichtsmodus verwenden, haben wir den Code wie folgt geschrieben:

function Iphone(model, screen, memory, SN) {
  this. model = model;
  this.screen = screen;
  this.memory = memory;
  this.SN = SN;
}
var phones = [];
for (var i = 0; i < 1000000; i++) {
  var memory = i % 2 == 0 ? 16 : 32;
  phones.push(new Iphone("iphone6s", 5.0, memory, i));
}

In diesem Code werden eine Million iPhones erstellt, und jedes iPhone wendet unabhängig einen Speicher an. Aber wenn wir genau hinschauen, können wir erkennen, dass die meisten iPhones ähnlich sind, außer dass der Speicher und die Seriennummer unterschiedlich sind. Wenn es sich um ein Programm mit relativ hohen Leistungsanforderungen handelt, müssen wir über eine Optimierung nachdenken.
Für Programme mit einer großen Anzahl ähnlicher Objekte können wir den Fliegengewichtsmodus zur Optimierung in Betracht ziehen. Wir haben analysiert, dass die meisten iPhone-Modelle, Bildschirme und Speicher gleich sind, sodass dieser Teil der Daten gemeinsam genutzt werden kann. Das ist Fliegengewicht. Die intrinsischen Daten im Modell definieren die Fliegengewichtsklasse wie folgt:

function IphoneFlyweight(model, screen, memory) {
  this.model = model;
  this.screen = screen;
  this.memory = memory;
}

Wir definieren die Fliegengewichtsklasse des iPhone, die drei Daten enthält: Modell, Bildschirm und Speicher. Wir benötigen auch eine Fliegengewichtsfabrik, um diese Daten zu verwalten:

 var flyweightFactory = (function () {
  var iphones = {};
  return {
    get: function (model, screen, memory) {
      var key = model + screen + memory;
      if (!iphones[key]) {
        iphones[key] = new IphoneFlyweight(model, screen, memory);
      }
      return iphones[key];
    }
  };
})();

In dieser Fabrik definieren wir ein Wörterbuch zum Speichern des Fliegengewichtsobjekts und stellen eine Methode zum Abrufen des Fliegengewichts bereit Objekt gemäß den Parametern. Wenn es im Wörterbuch vorhanden ist, wird es direkt zurückgegeben. Wenn nicht, wird es erstellt und zurückgegeben.
Dann erstellen wir eine Client-Klasse, die von der iPhone-Klasse modifiziert ist:

 function Iphone(model, screen, memory, SN) {
  this.flyweight = flyweightFactory.get(model, screen, memory);
  this.SN = SN;
}

Dann generieren wir immer noch mehrere iPhones

var phones = [];
for (var i = 0; i < 1000000; i++) {
  var memory = i % 2 == 0 ? 16 : 32;
  phones.push(new Iphone("iphone6s", 5.0, memory, i));
}
console.log(phones);

Der Schlüssel hier ist this.flyweight = flyweightFactory.get(model, screen, memory) im Iphone-Konstruktor. Dieser Code erhält Flyweight-Daten über die Flyweight-Factory. Wenn in der Flyweight-Factory bereits ein Objekt mit denselben Daten vorhanden ist, wird das Objekt direkt zurückgegeben. Mehrere iPhone-Objekte teilen sich diesen Teil derselben Daten, sodass die ursprünglichen ähnlichen Daten vorhanden sind Stark reduzierte Speichernutzung.

Anwendung des Fliegengewichtsmodus im DOM

Eine typische Anwendung des Fliegengewichtsmodus ist der DOM-Ereignisbetrieb. Der DOM-Ereignismechanismus ist in Ereignisblasen und Ereigniserfassung unterteilt. Lassen Sie uns die beiden kurz vorstellen:
Ereignisblasen: Das gebundene Ereignis beginnt vom innersten Element und sprudelt dann bis zum äußersten Element.
Ereigniserfassung: Das gebundene Ereignis beginnt vom äußersten Element auszulösen und geht dann zur innersten Ebene über
Angenommen, wir haben eine Menüliste in HTML

<ul class="menu">
  <li class="item">选项1</li>
  <li class="item">选项2</li>
  <li class="item">选项3</li>
  <li class="item">选项4</li>
  <li class="item">选项5</li>
  <li class="item">选项6</li>
</ul>

Klicken Sie auf den Menüpunkt und führen Sie den entsprechenden Vorgang aus. Um Ereignisse über jQuery zu binden, gehen Sie normalerweise wie folgt vor:

$(".item").on("click", function () {
  console.log($(this).text());
})

Binden Sie Ereignisse an jedes Listenelement und klicken Sie, um den entsprechenden Text auszugeben. Auf diese Weise gibt es vorerst kein Problem, aber wenn es sich um eine sehr lange Liste handelt, insbesondere wenn es sich um eine sehr lange Liste auf dem mobilen Endgerät handelt, kommt es zu Leistungsproblemen, da jedes Element an ein Ereignis gebunden ist und dauert Speicher aufladen. Aber diese Event-Handler sind sich tatsächlich sehr ähnlich, daher müssen wir sie optimieren.

$(".menu").on("click", ".item", function () {
  console.log($(this).text());
})

Die Ereignisbindung auf diese Weise kann die Anzahl der Ereignishandler reduzieren und verwendet auch das Flyweight-Muster. Der Ereignishandler ist der gemeinsame innere Teil und der jeweilige Text jedes Menüelements ist der äußere Teil. Lassen Sie uns kurz über das Prinzip der Ereignisdelegierung sprechen: Wenn Sie auf einen Menüpunkt klicken, wird das Ereignis vom li-Element zum ul-Element übertragen. Wenn wir das Ereignis an ul binden, binden wir tatsächlich ein Ereignis und verwenden dann das Ziel Bestimmen Sie im Ereignisparameter event, auf welches Element geklickt wurde, z. B. das erste Low-Level-li-Element, event.target ist li, sodass Sie das spezifische angeklickte Element abrufen und je nach Element unterschiedliche Verarbeitungen durchführen können.

Zusammenfassung

Der Flyweight-Modus ist ein Mittel zur Optimierung der Programmleistung. Er reduziert die Anzahl der Objekte durch die gemeinsame Nutzung gemeinsamer Daten, um das Programm zu optimieren. Der Fliegengewichtsmodus eignet sich für Szenarien mit einer großen Anzahl ähnlicher Objekte und hohen Leistungsanforderungen. Da der Flyweight-Modus die Trennung interner und externer Daten erfordert, was die logische Komplexität des Programms erhöht, wird empfohlen, den Flyweight-Modus nur dann zu verwenden, wenn Leistung erforderlich ist.

Vorteile des Fliegengewichtsmodus:
Er kann den Ressourcenbedarf von Webseiten um mehrere Größenordnungen reduzieren. Auch wenn die Anwendung des Fliegengewichtsmodus die Anzahl der Instanzen nicht auf eine reduzieren kann, können Sie dennoch viel davon profitieren.

Diese Art der Speicherung erfordert keine umfangreiche Änderung des Originalcodes. Nach dem Erstellen des Managers, der Factory und des Flyweights besteht die einzige Änderung am Code darin, von der direkten Instanziierung der Zielklasse zum Aufruf einer Methode des Managerobjekts zu wechseln.

Nachteile des Fliegengewichtsmodus:
Wenn er an unnötigen Stellen verwendet wird, wirkt sich das Ergebnis nachteilig auf die Effizienz des Codes aus. Während dieser Modus den Code optimiert, erhöht er auch seine Komplexität, was das Debuggen und die Wartung erschwert.

Der Grund dafür, dass das Debuggen behindert wird, liegt darin, dass es jetzt drei mögliche Orte gibt, an denen Fehler passieren können: der Manager, die Fabrik und das Fliegengewicht.

Durch diese Optimierung wird auch die Wartung erschwert. Anstelle einer klaren Struktur, die aus Objekten besteht, die Daten kapseln, sehen Sie sich jetzt einem Haufen fragmentierter und unordentlicher Dinge gegenüber. Die Daten werden an mindestens zwei Orten gespeichert. Am besten kommentieren Sie die internen und externen Daten.

Diese Optimierung sollte nur bei Bedarf durchgeführt werden. Es muss ein Kompromiss zwischen betrieblicher Effizienz und Wartbarkeit geschlossen werden. Wenn Sie nicht sicher sind, ob Sie den Fliegengewichtsmodus verwenden müssen, benötigen Sie ihn wahrscheinlich nicht. Der Flyweight-Modus eignet sich für Situationen, in denen die Systemressourcen fast vollständig genutzt werden und offensichtlich eine Optimierung erforderlich ist.

Dieser Modus ist besonders nützlich für Javascript-Programmierer, da er verwendet werden kann, um die Anzahl der auf einer Webseite verwendeten DOM-Elemente zu reduzieren, da diese Elemente viel Speicher verbrauchen. Durch die Kombination dieses Musters mit Organisationsmustern wie dem Composite-Muster können Sie funktionsreiche und komplexe Webanwendungen entwickeln, die in jeder modernen Javascript-Umgebung reibungslos laufen können.

Anwendbare Anlässe für den Fliegengewichtsmodus:
Auf Webseiten muss eine große Anzahl ressourcenintensiver Objekte verwendet werden. Werden nur wenige solcher Objekte verwendet, ist diese Optimierung nicht kosteneffektiv.

Zumindest ein Teil der im Objekt gespeicherten Daten kann in externe Daten umgewandelt werden. Darüber hinaus sollte die Speicherung dieser Daten außerhalb des Objekts relativ kostengünstig sein, da sonst die Auswirkungen dieses Ansatzes auf die Leistung praktisch bedeutungslos sind. Objekte, die viel Basiscode und HTML-Inhalte enthalten, eignen sich möglicherweise besser für diese Optimierung.

Nachdem die extrinsischen Daten getrennt wurden, ist die Anzahl der eindeutigen Objekte relativ gering.

Ich habe das Obige für Sie zusammengestellt und hoffe, dass es Ihnen in Zukunft hilfreich sein wird.

Verwandte Artikel:

JavascriptMehrere Methoden der Array-Definition (grafisches Tutorial)

Über JavascriptSammlung von Flusskontrollanweisungen (Bild- und Text-Tutorial)

Umfassendes Verständnis und praktische Verwendung der Funktion Javascript (beigefügter Code)

Das obige ist der detaillierte Inhalt vonDetaillierte Interpretation des Flyweight-Musters in der JavaScript-Designmusterprogrammierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
JavaScript und das Web: Kernfunktionalität und AnwendungsfälleJavaScript und das Web: Kernfunktionalität und AnwendungsfälleApr 18, 2025 am 12:19 AM

Zu den Hauptanwendungen von JavaScript in der Webentwicklung gehören die Interaktion der Clients, die Formüberprüfung und die asynchrone Kommunikation. 1) Dynamisches Inhaltsaktualisierung und Benutzerinteraktion durch DOM -Operationen; 2) Die Kundenüberprüfung erfolgt vor dem Einreichung von Daten, um die Benutzererfahrung zu verbessern. 3) Die Aktualisierung der Kommunikation mit dem Server wird durch AJAX -Technologie erreicht.

Verständnis der JavaScript -Engine: ImplementierungsdetailsVerständnis der JavaScript -Engine: ImplementierungsdetailsApr 17, 2025 am 12:05 AM

Es ist für Entwickler wichtig, zu verstehen, wie die JavaScript -Engine intern funktioniert, da sie effizientere Code schreibt und Leistungs Engpässe und Optimierungsstrategien verstehen kann. 1) Der Workflow der Engine umfasst drei Phasen: Parsen, Kompilieren und Ausführung; 2) Während des Ausführungsprozesses führt die Engine dynamische Optimierung durch, wie z. B. Inline -Cache und versteckte Klassen. 3) Zu Best Practices gehören die Vermeidung globaler Variablen, die Optimierung von Schleifen, die Verwendung von const und lass und die Vermeidung übermäßiger Verwendung von Schließungen.

Python vs. JavaScript: Die Lernkurve und BenutzerfreundlichkeitPython vs. JavaScript: Die Lernkurve und BenutzerfreundlichkeitApr 16, 2025 am 12:12 AM

Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

Python gegen JavaScript: Community, Bibliotheken und RessourcenPython gegen JavaScript: Community, Bibliotheken und RessourcenApr 15, 2025 am 12:16 AM

Python und JavaScript haben ihre eigenen Vor- und Nachteile in Bezug auf Gemeinschaft, Bibliotheken und Ressourcen. 1) Die Python-Community ist freundlich und für Anfänger geeignet, aber die Front-End-Entwicklungsressourcen sind nicht so reich wie JavaScript. 2) Python ist leistungsstark in Bibliotheken für Datenwissenschaft und maschinelles Lernen, während JavaScript in Bibliotheken und Front-End-Entwicklungsbibliotheken und Frameworks besser ist. 3) Beide haben reichhaltige Lernressourcen, aber Python eignet sich zum Beginn der offiziellen Dokumente, während JavaScript mit Mdnwebdocs besser ist. Die Wahl sollte auf Projektbedürfnissen und persönlichen Interessen beruhen.

Von C/C nach JavaScript: Wie alles funktioniertVon C/C nach JavaScript: Wie alles funktioniertApr 14, 2025 am 12:05 AM

Die Verschiebung von C/C zu JavaScript erfordert die Anpassung an dynamische Typisierung, Müllsammlung und asynchrone Programmierung. 1) C/C ist eine statisch typisierte Sprache, die eine manuelle Speicherverwaltung erfordert, während JavaScript dynamisch eingegeben und die Müllsammlung automatisch verarbeitet wird. 2) C/C muss in den Maschinencode kompiliert werden, während JavaScript eine interpretierte Sprache ist. 3) JavaScript führt Konzepte wie Verschlüsse, Prototypketten und Versprechen ein, die die Flexibilität und asynchrone Programmierfunktionen verbessern.

JavaScript -Engines: Implementierungen vergleichenJavaScript -Engines: Implementierungen vergleichenApr 13, 2025 am 12:05 AM

Unterschiedliche JavaScript -Motoren haben unterschiedliche Auswirkungen beim Analysieren und Ausführen von JavaScript -Code, da sich die Implementierungsprinzipien und Optimierungsstrategien jeder Engine unterscheiden. 1. Lexikalanalyse: Quellcode in die lexikalische Einheit umwandeln. 2. Grammatikanalyse: Erzeugen Sie einen abstrakten Syntaxbaum. 3. Optimierung und Kompilierung: Generieren Sie den Maschinencode über den JIT -Compiler. 4. Führen Sie aus: Führen Sie den Maschinencode aus. V8 Engine optimiert durch sofortige Kompilierung und versteckte Klasse.

Jenseits des Browsers: JavaScript in der realen WeltJenseits des Browsers: JavaScript in der realen WeltApr 12, 2025 am 12:06 AM

Zu den Anwendungen von JavaScript in der realen Welt gehören die serverseitige Programmierung, die Entwicklung mobiler Anwendungen und das Internet der Dinge. Die serverseitige Programmierung wird über node.js realisiert, die für die hohe gleichzeitige Anfrageverarbeitung geeignet sind. 2. Die Entwicklung der mobilen Anwendungen erfolgt durch reaktnative und unterstützt die plattformübergreifende Bereitstellung. 3.. Wird für die Steuerung von IoT-Geräten über die Johnny-Five-Bibliothek verwendet, geeignet für Hardware-Interaktion.

Erstellen einer SaaS-Anwendung mit mehreren Mietern mit Next.js (Backend Integration)Erstellen einer SaaS-Anwendung mit mehreren Mietern mit Next.js (Backend Integration)Apr 11, 2025 am 08:23 AM

Ich habe eine funktionale SaaS-Anwendung mit mehreren Mandanten (eine EdTech-App) mit Ihrem täglichen Tech-Tool erstellt und Sie können dasselbe tun. Was ist eine SaaS-Anwendung mit mehreren Mietern? Mit Multi-Tenant-SaaS-Anwendungen können Sie mehrere Kunden aus einem Sing bedienen

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Dreamweaver Mac

Dreamweaver Mac

Visuelle Webentwicklungstools

PHPStorm Mac-Version

PHPStorm Mac-Version

Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool

MantisBT

MantisBT

Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools