Inhaltsverzeichnis
Syntax des Objektpooldesigns
Verschiedene Algorithmen für das Design von Objektpools
Verzögerte Initialisierung und Synchronisierung
Eifrige Initialisierung mit gleichzeitigen Datenstrukturen
Zeitbasierter Ablauf
Verschiedene Möglichkeiten, das Objektpool-Entwurfsmuster zu verwenden
Methode 1: Einfaches Objektpool-Entwurfsmuster
Beispiel
Ausgabe
Methode 2: Universelles Objektpool-Entwurfsmuster
Best Practices für die Verwendung von Sperren auf Klassenebene
Internetverbindung
Datenbankverbindung
Thread-Pool
Bildbearbeitung
Dateisystemoperationen
Fazit
Heim Java javaLernprogramm Objektpool-Entwurfsmuster

Objektpool-Entwurfsmuster

Aug 19, 2023 pm 04:29 PM
设计模式 对象池 编程关键词

Objektpool-Entwurfsmuster

Ein in der Java-Programmierung häufig verwendetes Software-Designmuster ist das Objektpool-Designmuster. Dieser Modus steuert, wie Objekte im Objektpool erstellt und zerstört werden.

Verwenden Sie das Objektpool-Entwurfsmuster, um die Produktion und Zerstörung von Objekten zu verwalten. Das Konzept dieses Musters besteht darin, wiederverwendbare Objekte anzusammeln, anstatt jedes Mal, wenn sie benötigt werden, neue zu erstellen. In Situationen, in denen die Kosten für die Erstellung neuer Objekte erheblich sind, wie z. B. Netzwerkverbindungen, Datenbankverbindungen oder teure Objekte, verwenden Java-Programmierer häufig das Entwurfsmuster für Objektpools.

Syntax des Objektpooldesigns

In Java lautet die Syntax des Objektpool-Entwurfsmusters wie folgt: −

  • Erstellen Sie eine Objektsammlung mit fester Größe.

  • Initialisieren Sie die Poolelemente.

  • Verfolgen Sie derzeit im Pool befindliche Artikel.

  • Überprüfen Sie bei Bedarf, ob sich im Pool ein zugänglicher Gegenstand befindet.

  • Bitte stellen Sie sicher, dass Sie alle verfügbaren Gegenstände im Pool zeitnah selbst abholen und bei Bedarf ordnungsgemäß zurückgeben

  • Sollte jedoch derzeit kein Artikel in diesem Depot verfügbar sein, bitten wir darum, sofort einen neuen Artikel zu erstellen, um Zeit- oder Ressourcenverschwendung zu vermeiden, und ihn dann wieder in Umlauf zu bringen.

Verschiedene Algorithmen für das Design von Objektpools

Java-Objektpool-Entwurfsmuster können für verschiedene Algorithmen verwendet werden. Hier sind drei mögliche Strategien mit jeweils einzigartigen Code-Implementierungen:

Verzögerte Initialisierung und Synchronisierung

import java.util.ArrayList;
import java.util.List;

public class ObjectPool {
   private static ObjectPool instance;
   private List<Object> pool = new ArrayList<>();
   private int poolSize;

   private ObjectPool() {}
   
   public static synchronized ObjectPool getInstance(int poolSize) {
      if (instance == null) {
         instance = new ObjectPool();
         instance.poolSize = poolSize;
         for (int i = 0; i < poolSize; i++) {
            instance.pool.add(createObject());
         }
      }
      return instance;
   }

   private static Object createObject() {
      // Create and return a new object instance
      return new Object();
   }

   public synchronized Object getObject() {
      if (pool.isEmpty()) {
         return createObject();
      } else {
         return pool.remove(pool.size() - 1);
      }
   }

   public synchronized void releaseObject(Object object) {
      if (pool.size() < poolSize) {
         pool.add(object);
      }
   }
}
Nach dem Login kopieren

Die hier verwendete Technik betont die Thread-Sicherheit durch die Initialisierung eines entsprechend verzögerten und synchronisierten Objektpools mit voreingestellten Kapazitätsbeschränkungen, die bei Erweiterung geändert werden können. Leere Pools führen zu einer sicheren Produktion neuer Instanzen, während nicht vollständige Instanzen sorgfältig wieder eingeführt werden, um die ordnungsgemäße Betriebsintegrität aufrechtzuerhalten .

Eifrige Initialisierung mit gleichzeitigen Datenstrukturen

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class ObjectPool {
   private static final int POOL_SIZE = 10;
   private static ObjectPool instance = new ObjectPool();
   private BlockingQueue<Object> pool = new LinkedBlockingQueue<>(POOL_SIZE);

   private ObjectPool() {
      for (int i = 0; i < POOL_SIZE; i++) {
         pool.offer(createObject());
      }
   }

   private static Object createObject() {
      // Create and return a new object instance
      return new Object();
   }

   public static ObjectPool getInstance() {
      return instance;
   }

   public Object getObject() throws InterruptedException {
      return pool.take();
   }

   public void releaseObject(Object object) {
      pool.offer(object);
   }
}
Nach dem Login kopieren

In dieser Implementierung wird eine statische letzte Instanzvariable verwendet, um den Objektpool eifrig zu initialisieren. Die zugrunde liegende Datenstruktur ist eine LinkedBlockingQueue, die Thread-Sicherheit bietet, ohne dass eine Synchronisierung erforderlich ist. Während der Initialisierung werden Objekte zum Pool hinzugefügt und mit take() bei Bedarf aus der Warteschlange abgerufen. Wenn ein Artikel freigegeben wird, stellen Sie ihn mit offer() erneut in die Warteschlange.

Zeitbasierter Ablauf

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

public class ObjectPool {
   private static final int POOL_SIZE = 10;
   private static ObjectPool instance = new ObjectPool();
   private BlockingQueue<Object> pool = new LinkedBlockingQueue<>(POOL_SIZE);

   private ObjectPool() {}

   private static Object createObject() {
      // Create and return a new object instance
      return new Object();
   }

   public static ObjectPool getInstance() {
      return instance;
   }

   public Object getObject() throws InterruptedException {
      Object object = pool.poll(100, TimeUnit.MILLISECONDS);
      if (object == null) {
         object = createObject();
      }
      return object;
   }

   public void releaseObject(Object object) {
      pool.offer(object);
   }

}
Nach dem Login kopieren

Der Objektpool in dieser Version verwendet einen zeitbasierten Ablaufmechanismus anstelle einer festen Größe. Wenn ein Objekt benötigt wird, wird die Funktion poll() verwendet, um das Objekt aus dem Pool zu entfernen. Wenn kein Objekt verfügbar ist, wartet die Funktion eine Zeit lang und gibt dann null zurück. Objekte werden bei Bedarf generiert. Wenn kein Objekt vorhanden ist, wird ein neues Objekt generiert und zurückgegeben. Wenn ein Objekt freigegeben wird, verwenden Sie offer(), um es wieder in den Pool zu stellen. Die Funktion „expireObjects()“ wird verwendet, um abgelaufene Elemente basierend auf dem angegebenen Timeout-Wert aus dem Pool zu entfernen.

Verschiedene Möglichkeiten, das Objektpool-Entwurfsmuster zu verwenden

Das Objektpool-Entwurfsmuster von Java kann auf viele Arten implementiert werden. Nachfolgend finden Sie zwei typische Methoden, einschließlich Codebeispielen und Ergebnissen −

Methode 1: Einfaches Objektpool-Entwurfsmuster

Eine Möglichkeit, einen einfachen und praktischen Objektpool aufzubauen, besteht darin, einen Array-basierten Ansatz zu übernehmen. Dieser Ansatz funktioniert wie folgt: Sobald alle Objekte vollständig generiert sind, werden sie zur zukünftigen Verwendung in das entsprechende „Pool“-Array aufgenommen. Die Sammlung wird daraufhin überprüft, ob eines der erforderlichen Elemente verfügbar ist. Wenn es aus dem vorhandenen Bestand beschafft werden kann, wird es sofort zurückgegeben; andernfalls wird je nach Bedarf ein weiteres neues Objekt generiert.

Beispiel

public class ObjectPool {
   private static final int POOL_SIZE = 2;
   private static List<Object> pool = new ArrayList<Object>(POOL_SIZE);
    
   static {
      for(int i = 0; i < POOL_SIZE; i++) {
         pool.add(new Object());
      }
   }
    
   public static synchronized Object getObject() {
      if(pool.size() > 0) {
         return pool.remove(0);
      } else {
         return new Object();
      }
   }
    
   public static synchronized void releaseObject(Object obj) {
      pool.add(obj);
   }
}
Nach dem Login kopieren

Beispiel

public class ObjectPoolExample {
   public static void main(String[] args) {
      Object obj1 = ObjectPool.getObject();
      Object obj2 = ObjectPool.getObject();
        
      System.out.println("Object 1: " + obj1.toString());
      System.out.println("Object 2: " + obj2.toString());
        
      ObjectPool.releaseObject(obj1);
      ObjectPool.releaseObject(obj2);
        
      Object obj3 = ObjectPool.getObject();
      Object obj4 = ObjectPool.getObject();
        
      System.out.println("Object 3: " + obj3.toString());
      System.out.println("Object 4: " + obj4.toString());
   }
}
Nach dem Login kopieren

Ausgabe

Object 1: java.lang.Object@4fca772d
Object 2: java.lang.Object@1218025c
Object 3: java.lang.Object@4fca772d
Object 4: java.lang.Object@1218025c
Nach dem Login kopieren

Methode 2: Universelles Objektpool-Entwurfsmuster

Diese Technik nutzt Listen als Basis und erleichtert den Aufbau eines Standardobjektpools, indem Objekte in der Sammlung gespeichert werden, bis sie vollständig generiert und in die Sammlung aufgenommen werden. Immer wenn Zugriff auf ein Element erforderlich ist, durchsucht das System die verfügbaren Optionen im Pool. Wenn eine Option verfügbar ist, reicht dies aus. Wenn jedoch keine verfügbar ist, müssen Sie ein weiteres neues Projekt erstellen.

Beispiel

import java.util.ArrayList;
import java.util.List;

public class ObjectPool<T> {
   private List<T> pool;
    
   public ObjectPool(List<T> pool) {
      this.pool = pool;
   }
    
   public synchronized T getObject() {
      if (pool.size() > 0) {
         return pool.remove(0);
      } else {
         return createObject();
      }
   }
    
   public synchronized void releaseObject(T obj) {
      pool.add(obj);
   }
    
   private T createObject() {
      T obj = null;
      // create object code here
      return obj;
   }
    
   public static void main(String[] args) {
      List<String> pool = new ArrayList<String>();
      pool.add("Object 1");
      pool.add("Object 2");
        
      ObjectPool<String> objectPool = new ObjectPool<String>(pool);
        
      String obj1 = objectPool.getObject();
      String obj2 = objectPool.getObject();
        
      System.out.println("Object 1: " + obj1);
      System.out.println("Object 2: " + obj2);
        
      objectPool.releaseObject(obj1);
      objectPool.releaseObject(obj2);
        
      String obj3 = objectPool.getObject();
      String obj4 = objectPool.getObject();
        
      System.out.println("Object 3: " + obj3);
      System.out.println("Object 4: " + obj4);
   }
}
Nach dem Login kopieren

Ausgabe

Object 1: Object 1
Object 2: Object 2
Object 3: Object 1
Object 4: Object 2
Nach dem Login kopieren

Best Practices für die Verwendung von Sperren auf Klassenebene

Java-Programmierer verwenden häufig das Objektpool-Entwurfsmuster, wenn die Kosten für die Herstellung neuer Objekte hoch sind. Zu den typischen Nutzungsszenarien gehören −

Internetverbindung

In einem Java-Programm können Netzwerkverbindungen mithilfe des Objektpool-Entwurfsmusters verwaltet werden. Es ist besser, vorhandene Verbindungen aus einem Pool wiederzuverwenden, anstatt jedes Mal neue erstellen zu müssen. Dies kann die Funktionalität der Anwendung verbessern und gleichzeitig vereinfachen Belastung des Netzwerkservers.

Datenbankverbindung

Ähnlich wie bei der Netzwerkverbindungsverwaltung können Java-Anwendungen auch das Objektpool-Entwurfsmuster verwenden, um Datenbankverbindungen zu verwalten. Es ist besser, eine vorhandene Verbindung aus dem Pool wiederzuverwenden, als jedes Mal, wenn eine Datenbankverbindung benötigt wird, eine neue zu erstellen. Dadurch kann die Anwendungsleistung verbessert und die Belastung des Datenbankservers verringert werden.

Thread-Pool

Entwickler, die Java-Programme verwenden, sollten das Objektpool-Entwurfsmuster übernehmen, um Thread-Pools effektiv zu verwalten. Anstatt jeden erforderlichen Thread nach Bedarf neu zu erstellen, beruht eine gut geplante Nutzung auf der Wiederverwendung bereits vorhandener Threads, die in einer bestimmten Arbeitsgruppe verfügbar sind. Daher wird eine optimale Anwendungsleistung gefördert, indem der Overhead des Thread-Erstellungs- und Beendigungsprozesses niedrig gehalten wird, was auf die Effizienz der Struktur zurückzuführen ist.

Bildbearbeitung

Bei intensiven Bildverarbeitungsaufgaben in Java-Programmen lohnt es sich, über die Implementierung des Objektpool-Entwurfsmusters nachzudenken. Durch die Nutzung bereits vorhandener Objekte aus einem dedizierten Pool können Sie die Leistung Ihrer Anwendung beschleunigen und gleichzeitig den gesamten Rechenbedarf Ihrer Fotobearbeitungsaufgaben reduzieren.

Dateisystemoperationen

Wenn Sie in Ihrer Java-Anwendung vor umfangreichen Bildverarbeitungsaufgaben stehen, lohnt es sich, über die Anwendung des Objektpool-Entwurfsmusters nachzudenken. Diese Technik nutzt vorhandene Elemente in einem bestimmten Pool, um die Ausgabegeschwindigkeit des Programms zu erhöhen und die für die Bearbeitung von Fotos erforderlichen Rechenressourcen zu reduzieren.

Fazit

Das Objektpool-Entwurfsmuster ist ein nützliches Entwurfsmuster in der Java-Programmierung, das sich für Situationen eignet, in denen die Kosten für die Erstellung neuer Objekte hoch sind. Es bietet eine Möglichkeit, die Versorgung mit wiederverwendbaren Objekten zu kontrollieren und so die Gesamtkosten für die Entwicklung neuer Produkte zu senken. Ein einfacher Objektpool oder ein generischer Objektpool sind zwei Beispiele für die Implementierung des Objektpool-Entwurfsmusters. Das Objektpool-Entwurfsmuster wird häufig in der Java-Programmierung verwendet, um teure Objekte wie Datenbankverbindungen und Netzwerkverbindungen zu verarbeiten. Es hat einen ähnlichen Zweck wie das Flyweight-Muster und das Singleton-Muster, hat jedoch unterschiedliche Verwendungszwecke.

Das obige ist der detaillierte Inhalt vonObjektpool-Entwurfsmuster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

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

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Der Unterschied zwischen Entwurfsmustern und Architekturmustern im Java-Framework Der Unterschied zwischen Entwurfsmustern und Architekturmustern im Java-Framework Jun 02, 2024 pm 12:59 PM

Im Java-Framework besteht der Unterschied zwischen Entwurfsmustern und Architekturmustern darin, dass Entwurfsmuster abstrakte Lösungen für häufige Probleme beim Softwaredesign definieren und sich dabei auf die Interaktion zwischen Klassen und Objekten konzentrieren, beispielsweise Fabrikmuster. Architekturmuster definieren die Beziehung zwischen Systemstrukturen und Modulen und konzentrieren sich auf die Organisation und Interaktion von Systemkomponenten, wie z. B. eine geschichtete Architektur.

Analyse des Decorator-Musters in Java-Entwurfsmustern Analyse des Decorator-Musters in Java-Entwurfsmustern May 09, 2024 pm 03:12 PM

Das Dekoratormuster ist ein strukturelles Entwurfsmuster, das das dynamische Hinzufügen von Objektfunktionen ermöglicht, ohne die ursprüngliche Klasse zu ändern. Es wird durch die Zusammenarbeit von abstrakten Komponenten, konkreten Komponenten, abstrakten Dekoratoren und konkreten Dekoratoren implementiert und kann Klassenfunktionen flexibel erweitern, um sich ändernden Anforderungen gerecht zu werden. In diesem Beispiel werden Milch- und Mokka-Dekoratoren zu Espresso für einen Gesamtpreis von 2,29 $ hinzugefügt, was die Leistungsfähigkeit des Dekoratormusters bei der dynamischen Änderung des Verhaltens von Objekten demonstriert.

Praktische Fallanalyse des PHP-Entwurfsmusters Praktische Fallanalyse des PHP-Entwurfsmusters May 08, 2024 am 08:09 AM

1. Factory-Muster: Trennen Sie Objekterstellung und Geschäftslogik und erstellen Sie Objekte bestimmter Typen über Factory-Klassen. 2. Beobachtermuster: Ermöglicht Subjektobjekten, Beobachterobjekte über ihre Zustandsänderungen zu benachrichtigen, wodurch eine lose Kopplung und ein Beobachtermuster erreicht werden.

Die wunderbare Verwendung des Adaptermusters in Java-Entwurfsmustern Die wunderbare Verwendung des Adaptermusters in Java-Entwurfsmustern May 09, 2024 pm 12:54 PM

Das Adaptermuster ist ein strukturelles Entwurfsmuster, das die Zusammenarbeit inkompatibler Objekte ermöglicht. Es wandelt eine Schnittstelle in eine andere um, sodass die Objekte reibungslos interagieren können. Der Objektadapter implementiert das Adaptermuster, indem er ein Adapterobjekt erstellt, das das angepasste Objekt enthält, und die Zielschnittstelle implementiert. In einem praktischen Fall kann der Client (z. B. MediaPlayer) über den Adaptermodus Medien im erweiterten Format (z. B. VLC) abspielen, obwohl er selbst nur normale Medienformate (z. B. MP3) unterstützt.

Wie Entwurfsmuster mit Herausforderungen bei der Codewartung umgehen Wie Entwurfsmuster mit Herausforderungen bei der Codewartung umgehen May 09, 2024 pm 12:45 PM

Entwurfsmuster lösen Herausforderungen bei der Codewartung, indem sie wiederverwendbare und erweiterbare Lösungen bereitstellen: Beobachtermuster: Ermöglicht Objekten, Ereignisse zu abonnieren und Benachrichtigungen zu erhalten, wenn sie auftreten. Factory-Muster: Bietet eine zentralisierte Möglichkeit, Objekte zu erstellen, ohne auf konkrete Klassen angewiesen zu sein. Singleton-Muster: stellt sicher, dass eine Klasse nur eine Instanz hat, die zum Erstellen global zugänglicher Objekte verwendet wird.

PHP-Entwurfsmuster: Testgetriebene Entwicklung in der Praxis PHP-Entwurfsmuster: Testgetriebene Entwicklung in der Praxis Jun 03, 2024 pm 02:14 PM

TDD wird verwendet, um hochwertigen PHP-Code zu schreiben. Die Schritte umfassen: Testfälle schreiben, die erwartete Funktionalität beschreiben und sie zum Scheitern bringen. Schreiben Sie Code so, dass nur die Testfälle ohne übermäßige Optimierung oder detailliertes Design erfolgreich sind. Nachdem die Testfälle bestanden wurden, optimieren und überarbeiten Sie den Code, um die Lesbarkeit, Wartbarkeit und Skalierbarkeit zu verbessern.

Anwendung von Designmustern im Guice-Framework Anwendung von Designmustern im Guice-Framework Jun 02, 2024 pm 10:49 PM

Das Guice-Framework wendet eine Reihe von Entwurfsmustern an, darunter: Singleton-Muster: Durch die @Singleton-Annotation wird sichergestellt, dass eine Klasse nur eine Instanz hat. Factory-Methodenmuster: Erstellen Sie eine Factory-Methode über die Annotation @Provides und rufen Sie die Objektinstanz während der Abhängigkeitsinjektion ab. Strategiemodus: Kapseln Sie den Algorithmus in verschiedene Strategieklassen und geben Sie die spezifische Strategie über die Annotation @Named an.

Was sind die Vor- und Nachteile der Verwendung von Entwurfsmustern im Java-Framework? Was sind die Vor- und Nachteile der Verwendung von Entwurfsmustern im Java-Framework? Jun 01, 2024 pm 02:13 PM

Zu den Vorteilen der Verwendung von Entwurfsmustern in Java-Frameworks gehören: verbesserte Lesbarkeit, Wartbarkeit und Skalierbarkeit des Codes. Zu den Nachteilen gehören Komplexität, Leistungsaufwand und eine steile Lernkurve aufgrund übermäßiger Nutzung. Praktischer Fall: Der Proxy-Modus wird zum verzögerten Laden von Objekten verwendet. Setzen Sie Entwurfsmuster mit Bedacht ein, um ihre Vorteile zu nutzen und ihre Nachteile zu minimieren.

See all articles