Tutorials  /  JavaScript

Effizientes Verwalten von Objekten mit dem Flyweight-Designmuster in Java

Ccentron Redaktion · November 2024 ·3 Min. Lesezeit ·JavaScript, Tutorial

In der modernen Softwareentwicklung ist die Optimierung der Speichernutzung von größter Bedeutung, insbesondere bei Anwendungen, die auf Geräten mit begrenzten Ressourcen laufen oder eine große Anzahl von Objekten verarbeiten müssen. Das Flyweight-Designmuster bietet eine Lösung zur effizienten Verwaltung solcher Objekte, indem gemeinsame Teile geteilt werden. Dieser Beitrag erforscht, wie das Flyweight-Muster eine wertvolle Ergänzung für Ihr Java-Entwicklungswerkzeug sein kann.

Verständnis des Flyweight-Designmusters

Das Flyweight-Muster, ein strukturelles Designmuster, dreht sich alles um die Nutzung von Teilung, um eine große Anzahl von feinkörnigen Objekten effizient zu unterstützen. Dieses Muster ist besonders nützlich in Szenarien, in denen Anwendungen eine enorme Anzahl von Objekten erstellen müssen, was zu erheblichem Speicherverbrauch führen könnte.

VM

Passende Infrastruktur bei centron

Node-Anwendungen wollen deployt werden: ccloud³ VMs mit vollem Root-Zugriff ab 3,12 € im Monat – oder gleich als Managed Server, wenn der Betrieb nicht bei Ihnen liegen soll. Cloud Server mieten →

Wann das Flyweight-Muster verwenden

Vor der Implementierung des Flyweight-Musters sollten Sie Folgendes berücksichtigen:

  • Die Anwendung sollte eine große Anzahl von Objekten benötigen.
  • Die Objekterstellung sollte speicherintensiv und potenziell langsam sein.
  • Objekteigenschaften können in intrinsische und extrinsische Eigenschaften unterteilt werden, wobei die extrinsischen Eigenschaften vom Kunden definiert werden.

Die intrinsischen Eigenschaften machen jedes Objekt einzigartig, während die extrinsischen Eigenschaften extern durch Kunden-Code festgelegt werden, um verschiedene Operationen durchzuführen.

Implementierung von Flyweight in Java

Um die Implementierung des Flyweight-Musters zu demonstrieren, betrachten wir ein Szenario mit Formen wie Linien und Ovalen, die Attribute wie Farbe und Breite haben können.

Shape Interface und Concrete Classes

Zuerst definieren wir ein Shape Interface mit einer Methode draw zum Zeichnen von Formen:

Java
package com.journaldev.design.flyweight;

import java.awt.Color;
import java.awt.Graphics;

public interface Shape {
    void draw(Graphics g, int x, int y, int width, int height, Color color);
}

Als nächstes implementieren die konkreten Klassen Line und Oval das Shape Interface. Die Klasse Line hat keine intrinsischen Eigenschaften, während die Klasse Oval eine boolesche Eigenschaft fill enthält, um zu bestimmen, ob das Oval gefüllt werden soll:

Java
// Line.java
package com.journaldev.design.flyweight;

import java.awt.Color;
import java.awt.Graphics;

public class Line implements Shape {
    public Line() {
        System.out.println("Creating Line object");
        try {
            Thread.sleep(2000); // Simuliere Zeitverzögerung
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public void draw(Graphics line, int x1, int y1, int x2, int y2, Color color) {
        line.setColor(color);
        line.drawLine(x1, y1, x2, y2);
    }
}

Flyweight Factory

Die Klasse ShapeFactory verwendet eine HashMap, um Instanzen von Formen zu verwalten. Wenn eine Form eines bestimmten Typs in der Map existiert, wird sie zurückgegeben; andernfalls wird eine neue Form erstellt, zur Map hinzugefügt und dann zurückgegeben:

Java
package com.journaldev.design.flyweight;

import java.util.HashMap;

public class ShapeFactory {
    private static final HashMap<ShapeType, Shape> shapes = new HashMap<>();

    public static Shape getShape(ShapeType type) {
        Shape shape = shapes.get(type);
        if (shape == null) {
            if (type.equals(ShapeType.OVAL_FILL)) {
                shape = new Oval(true);
            } else if (type.equals(ShapeType.OVAL_NOFILL)) {
                shape = new Oval(false);
            } else if (type.equals(ShapeType.LINE)) {
                shape = ein Line();
            }
            shapes.put(type, shape);
        }
        return shape;
    }

    public static enum ShapeType {
        OVAL_FILL, OVAL_NOFILL, LINE;
    }
}

Beispiel und Nutzung

Das bereitgestellte Beispiel zeigt eine DrawingClient-Klasse, eine JFrame-Anwendung, die die Flyweight-Fabrik verwendet, um verschiedene Formen mit zufälligen Attributen zu zeichnen:

Java
// DrawingClient.java
package com.journaldev.design.flyweight;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class DrawingClient is ein JFrame {
    // Andere Methoden wurden der Kürze halber weggelassen
    public void actionPerformed(ActionEvent event) {
        Graphics g = panel.getGraphics();
        for (int i = 0; i < 20; ++i) {
            Shape shape = ShapeFactory.getShape(getRandomShape());
            shape.draw(g, getRandomX(), getRandomY(), getRandomWidth(),
                    getRandomHeight(), getRandomColor());
        }
    }
}

Das Flyweight-Muster erweist sich als vorteilhaft für die Speicherverwaltung und Leistung in Java-Anwendungen. Insbesondere wenn es um eine große Anzahl von Objektinstanzen geht. Durch das Verständnis und die Implementierung dieses Musters können Entwickler effizientere und skalierbarere Anwendungen sicherstellen.

Jetzt 200 € Guthaben sichern

Testen Sie Ihr Setup auf ccloud³

Registrieren Sie sich in der ccloud³ und erhalten Sie 200 € Startguthaben für Ihr Projekt – z. B. für eine PostgreSQL-VM mit automatischen Backups.

centron Redaktion Technische Redaktion

Das Redaktionsteam von centron schreibt Anleitungen aus dem Betriebsalltag: getestet auf unserer eigenen Plattform, betrieben im Rechenzentrum in Hallstadt bei Bamberg.

Kategorie JavaScript
Teilen
Noch offene Fragen?

Unser Team hilft Ihnen bei Ihrem konkreten Setup weiter – von Menschen, die die Plattform selbst betreiben.

War dieses Tutorial hilfreich?

Ihre Antwort wird anonym gespeichert und hilft uns, die Tutorials zu verbessern.

Kommentare

Noch keine Kommentare – stellen Sie die erste Frage zu diesem Tutorial.

Zum Kommentieren anmelden

Kommentare stehen centron-Kunden offen. Melden Sie sich in Ihrem Konto an, um eine Frage zu diesem Tutorial zu stellen.

Weiterlesen

Das könnte Sie auch interessieren

Jetzt kostenlos anfangen

Melden Sie sich an und erhalten Sie in den ersten 60 Tagen ein Guthaben von 200 € bei centron.

Dieses Werbeangebot gilt nur für neue Konten. Angebot ausschließlich für Gewerbetreibende.

Jetzt loslegen Sales kontaktieren