Java-Entwurfsmuster (Entwurfsmuster): Fliegengewicht

Heute werfen wir einen Blick auf ein weiteres Flyweight-Entwurfsmuster ( Java-Entwurfsmuster) aus der Kategorie derStrukturmuster. Entwurfsmuster dieser Kategorie befassen sich mit Klassenstrukturen wieVererbung undKomposition.

Was ist das Flyweight-Entwurfsmuster?

Flyweight ist ein Entwurfsmuster, das in erster Linie dazu dient, die Anzahl der erstellten Objekte zu reduzieren, da es versucht, vorhandene Objekte mit denselben oder ähnlichen Eigenschaften auf Klassenebene wiederzuverwenden und nur dann ein neues Objekt zu erstellen, wenn kein passendes Objekt gefunden wird. Dadurch wird der Speicherbedarf für Daten, die von ähnlichen Objekten gemeinsam genutzt werden, minimiert.

Welches Problem löst das Flyweight-Entwurfsmuster?

Es löst das Problem in Anwendungen, die mit einer großen Anzahl von Objekten arbeiten, die viel Speicherplatz benötigen würden, wenn sie separat gespeichert würden, und die Kosten für ihre Erstellung sind nicht unerheblich. Dieses Muster löst das Problem, indem es gemeinsame Daten extrahiert und sie zwischen den Objekten austauscht, wodurch der benötigte Speicherplatz reduziert und bereits erstellte Objekte genutzt werden.

Beispiel für die Implementierung von Flyweight in Java

Wir werden nun ein Programm schreiben, um ein einfaches System für den Betrieb eines Pizzarestaurants zu simulieren, und wir werden demonstrieren, wie man mit Hilfe des Flyweight-Entwurfsmusters Instanzen von Pizza effizient gemeinsam nutzen und die Anzahl der erstellten Objekte minimieren kann. Das Programm erstellt eine Pizzeria, nimmt Bestellungen für verschiedene Pizzasorten entgegen und serviert sie. Sie besteht aus den Klassen Pizza, Bestellung und Pizzeria und Hauptklasse.

Pizza.java

package designpatterns;

import java.util.HashMap;
import java.util.Map;

public class Pizza {
    private static Map<String, Pizza> pizzaCache = new HashMap<>();
    private String nazov;

    private Pizza(String nazov) {
        this.nazov = nazov;
    }

    public static Pizza intern(String nazov) {
        pizzaCache.putIfAbsent(nazov, new Pizza(nazov));
        return pizzaCache.get(nazov);
    }

    public static int pocetDruhov() {
        return pizzaCache.size();
    }

    @Override
    public String toString() {
        return nazov;
    }
}

Die Klasse Pizza repräsentiert einen Pizzatyp und verwendet das Flyweight-Muster, um Instanzen von Pizzen mit demselben Namen gemeinsam zu nutzen. Es hat eine intern()-Methode, die eine neue Pizza nur dann erstellt, wenn sie noch nicht existiert, und eine pocetSpecies()-Methode, die die Anzahl der verschiedenen Pizzasorten zurückgibt.

Bestellung.java

package designpatterns;

public class Objednavka {
    private Pizza pizza;
    private int cisloStolu;

    private Objednavka(Pizza pizza, int cisloStolu) {
        this.pizza = pizza;
        this.cisloStolu = cisloStolu;
    }

    public static Objednavka create(String nazov, int cisloStolu) {
        Pizza pizza = Pizza.intern(nazov);
        return new Objednavka(pizza, cisloStolu);
    }

    @Override
    public String toString() {
        return "Posielam pizzu " + pizza + " na stol " + cisloStolu;
    }
}

Die Klasse Order stellt eine Pizzabestellung dar. Jede Bestellung enthält einen Link zu einer bestimmten Pizza und die Tischnummer, an die die Pizza geliefert werden soll.

Pizzeria.java

package designpatterns;

public class Pizzeria {
    private java.util.List<Objednavka> objednavky = new java.util.ArrayList<>();

    public void prijatObjednavku(String druh, int cisloStolu) {
        objednavky.add(Objednavka.create(druh, cisloStolu));
    }

    public void obsluzit() {
        for (Objednavka order : objednavky) {
            System.out.println(order);
        }
    }

    public int pocetPrijatychObjednavok() {
        return objednavky.size();
    }
}

Die Klasse Pizzeria stellt eine Pizzeria dar, die Bestellungen annimmt und Methoden zur Bearbeitung und Auflistung von Bestellungen bereitstellt. Sie bietet auch eine Methode, um die Anzahl der eingegangenen Bestellungen zu ermitteln.

Main.java

import designpatterns.Pizzeria;
import designpatterns.Pizza;

public class Main {
    public static void main(String[] args) {
        Pizzeria pizzeria = new Pizzeria();
        pizzeria.prijatObjednavku("Hawai", 2);
        pizzeria.prijatObjednavku("Quattro Formaggi", 1);
        pizzeria.prijatObjednavku("Margherita", 1);
        pizzeria.prijatObjednavku("Napoletana", 5);
        pizzeria.prijatObjednavku("Hawai", 4);
        pizzeria.prijatObjednavku("Quattro Formaggi", 3);
        pizzeria.prijatObjednavku("Margherita", 3);
        pizzeria.prijatObjednavku("Hawai", 3);
        pizzeria.prijatObjednavku("Margherita", 6);
        pizzeria.prijatObjednavku("Quattro Formaggi", 2);
        pizzeria.obsluzit();
        System.out.println();
        System.out.println("Pocet prijatych objednavok: " + pizzeria.pocetPrijatychObjednavok());
        System.out.println("Pocet pouzitych objektov typu pizza: " + Pizza.pocetDruhov());
    }
}

In der Hauptmethode wird eine Pizzeria-Instanz erstellt und dann werden verschiedene Pizzabestellungen erstellt. Alle Bestellungen werden serviert, und schließlich werden die Anzahl der eingegangenen Bestellungen und die Anzahl der verwendeten Pizza-Objekte aufgelistet. Wir haben also die gemeinsame Nutzung von pizzaähnlichen Gegenständen durch unterschiedliche Orden nachgewiesen.

Die Ausgabe dieses Beispiels ist:

Screenshot der Ausgabe des Beispiels

Zusammenfassung

Das Flyweight-Entwurfsmuster wird in Situationen verwendet, in denen wir ähnliche Objektinstanzen zwischenspeichern und wiederverwenden müssen. Sie zielt hauptsächlich darauf ab, den Overhead bei der Erstellung von Objekten und deren Speicherbedarf zu optimieren.

Wir haben die Dateien mit dem obigen Beispiel in Form von Code vorbereitet, den Sie direkt in Java ausführen können. Laden Sie den Java-Flyweight-Code hier herunter.

Wenn Sie als Java-Programmierer auf der Suche nach Arbeit sind, informieren Sie sich über unsere Unternehmensvorteile und reagieren Sie auf unsere aktuellen Stellenangebote.

Über den Autor

Jozef Wagner

Leitender Java-Entwickler

Ich programmiere seit mehr als 10 Jahren in Java, arbeite derzeit bei msg life Slovakia als leitender Java-Programmierer und helfe Kunden bei der Umsetzung ihrer Anforderungen in die Versicherungssoftware Life Factory. In meiner Freizeit entspanne ich gerne in den Bergen oder spiele ein gutes Computerspiel.

Informieren Sie uns über sich