Prototype og Object Pool
Lær at bruge Prototype til kloning af objekter og Object Pool til effektiv håndtering af genanvendelige ressourcer.
Prototype og Object Pool er en gratis Ren arkitektur og designmønstre i praksis-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Ren arkitektur og designmønstre i praksis, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Ren arkitektur og designmønstre i praksis-kurset indeholder 4 lektioner i alt.
Velkommen: Prototype og Object Pool
Velkommen til denne lektion om to effektive mønstre til oprettelse af objekter: Prototype og Object Pool.
Disse mønstre hjælper os med at håndtere oprettelse af objekter effektivt, så ydeevnen og ressourceudnyttelsen i vores applikationer forbedres.
Forstå Prototype-mønsteret
Prototype-mønsteret handler om at oprette nye objekter ved at klone en eksisterende instans i stedet for at oprette nye fra bunden. Tænk på det som en biologisk klon!
- Det er nyttigt, når oprettelse af objekter er kompleks eller ressourcekrævende.
- Det fjerner behovet for underklasser af fabrikker til at oprette objekter.
- Det gør det muligt at oprette mange lignende objekter ud fra et objekt, der fungerer som skabelon.
Overfladisk kontra dyb kopiering
Når du kloner objekter, er det vigtigt at forstå forskellen på overfladisk kopiering og dyb kopiering:
- Overfladisk kopiering: Opretter et nyt objekt, men kopierer referencer til indlejrede objekter. Ændringer i klonens indlejrede objekter påvirker originalen.
- Dyb kopiering: Opretter et nyt objekt og opretter rekursivt nye kopier af alle indlejrede objekter. Klonen er helt uafhængig af originalen.
Prototypeeksempel: Overfladisk kopiering
I Java bruges interfacet Cloneable og metoden clone(). Dette eksempel viser en overfladisk kopi, hvor en ændring af config i klonen også ændrer originalen.
class Configuration {
String setting;
public Configuration(String setting) {
this.setting = setting;
}
}
class Report implements Cloneable {
String name;
Configuration config;
public Report(String name, Configuration config) {
this.name = name;
this.config = config;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // Shallow copy
}
public void display() {
System.out.println("Report: " + name + ", Setting: " + config.setting);
}
}
public class Main {
public static void main(String[] args) {
Configuration initialConfig = new Configuration("Default");
Report originalReport = new Report("Monthly Sales", initialConfig);
try {
Report clonedReport = (Report) originalReport.clone();
clonedReport.name = "Quarterly Sales";
clonedReport.config.setting = "Aggregated"; // Changes original's config!
originalReport.display();
clonedReport.display();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}Prototypeeksempel: Dyb kopiering
For at opnå en dyb kopi skal du manuelt klone ændringsbare felter i din clone()-metode. Det sikrer, at originalobjektets indlejrede tilstand ikke påvirkes.
class Configuration implements Cloneable {
String setting;
public Configuration(String setting) {
this.setting = setting;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Report implements Cloneable {
String name;
Configuration config;
public Report(String name, Configuration config) {
this.name = name;
this.config = config;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Report cloned = (Report) super.clone();
cloned.config = (Configuration) config.clone(); // Deep copy for config
return cloned;
}
public void display() {
System.out.println("Report: " + name + ", Setting: " + config.setting);
}
}
public class Main {
public static void main(String[] args) {
Configuration initialConfig = new Configuration("Default");
Report originalReport = new Report("Monthly Sales", initialConfig);
try {
Report clonedReport = (Report) originalReport.clone();
clonedReport.name = "Quarterly Sales";
clonedReport.config.setting = "Aggregated"; // Only changes cloned's config
originalReport.display();
clonedReport.display();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}Hvornår skal du bruge Prototype?
Overvej Prototype-mønsteret, når:
- Det er ressourcekrævende at oprette objekter (f.eks. databaseforespørgsler eller omfattende beregninger).
- Du skal oprette mange objekter, der ligner et eksisterende objekt.
- Du vil afkoble din kode fra de konkrete klasser for de objekter, du skal oprette.
- Du skal kunne tilføje eller fjerne objekter dynamisk under kørsel.
Introduktion til Object Pool-mønsteret
Object Pool-mønsteret håndterer en samling initialiserede objekter, der er klar til brug. Det er som at have et værktøjssæt, der altid er klar!
I stedet for at oprette og destruere objekter ofte låner du dem fra puljen og afleverer dem tilbage, når du er færdig. Det er især nyttigt til ressourcekrævende ressourcer.
Sådan fungerer Object Pool
Grundideen er at genbruge objekter. En Object Pool har typisk:
- Pool: En samling (f.eks. en liste) af tilgængelige objekter.
- Acquire-metode: Henter et objekt fra puljen. Hvis ingen er tilgængelige, kan den oprette et nyt eller vente.
- Release-metode: Returnerer et objekt til puljen, så det kan genbruges.
- Initialisering: Puljen kan oprette et bestemt antal objekter på forhånd ved opstart.
Eksempel på Object Pool
Her er et enkelt eksempel på en Object Pool, der håndterer DatabaseConnection-objekter. Bemærk, hvordan forbindelser hentes og derefter frigives tilbage til puljen.
import java.util.ArrayList;
import java.util.List;
class DatabaseConnection {
private int id;
public DatabaseConnection(int id) {
this.id = id;
System.out.println("Connection " + id + " created.");
}
public void connect() {
System.out.println("Connection " + id + " connected.");
}
}
class ConnectionPool {
private List<DatabaseConnection> availableConnections = new ArrayList<>();
private List<DatabaseConnection> inUseConnections = new ArrayList<>();
private int maxPoolSize;
private int counter = 0;
public ConnectionPool(int maxPoolSize) {
this.maxPoolSize = maxPoolSize;
}
public synchronized DatabaseConnection acquireConnection() {
if (availableConnections.isEmpty() && inUseConnections.size() < maxPoolSize) {
DatabaseConnection newConn = new DatabaseConnection(++counter);
inUseConnections.add(newConn);
return newConn;
} else if (!availableConnections.isEmpty()) {
DatabaseConnection conn = availableConnections.remove(0);
inUseConnections.add(conn);
return conn;
} else {
System.out.println("Pool is full, no connections available.");
return null; // Or wait, throw exception
}
}
public synchronized void releaseConnection(DatabaseConnection connection) {
if (connection != null && inUseConnections.remove(connection)) {
availableConnections.add(connection);
System.out.println("Connection " + connection.id + " released.");
} else {
System.out.println("Attempted to release unknown connection.");
}
}
}
public class Main {
public static void main(String[] args) {
ConnectionPool pool = new ConnectionPool(2);
DatabaseConnection conn1 = pool.acquireConnection();
if (conn1 != null) conn1.connect();
DatabaseConnection conn2 = pool.acquireConnection();
if (conn2 != null) conn2.connect();
DatabaseConnection conn3 = pool.acquireConnection(); // Should say pool is full
pool.releaseConnection(conn1);
DatabaseConnection conn4 = pool.acquireConnection(); // Should reuse conn1
if (conn4 != null) conn4.connect();
}
}Fordele ved Object Pool
Brug af en Object Pool giver betydelige fordele:
- Ydeevne: Reducerer belastningen ved oprettelse af objekter og affaldsindsamling.
- Ressourcestyring: Kontrollerer det maksimale antal aktive objekter og forhindrer, at ressourcerne opbruges.
- Reduceret latenstid: Objekterne er klar med det samme uden forsinkelsen ved instansiering.
- Forbedret stabilitet: Forudsigelig brug af ressourcer.
Hurtigt tjek: Designmønstre
Du har et komplekst ImageProcessor-objekt, der tager lang tid at initialisere, fordi det indlæser store konfigurationsfiler. Du skal oprette mange instanser af denne processor, hver med lidt forskellige parametre, men baseret på den samme indledende opsætning. Hvilket designmønster er bedst egnet til effektivt at oprette disse nye ImageProcessor-instanser?
Opsummering: Prototype og Object Pool
Godt arbejde! I denne lektion har du lært om to effektive mønstre til oprettelse af objekter:
- Prototype: Opretter nye objekter ved at klone eksisterende objekter og er nyttigt ved ressourcekrævende eller kompleks instansiering af objekter. Husk forskellen på overfladisk og dyb kopiering!
- Object Pool: Håndterer en samling objekter, der kan genbruges, og reducerer belastningen ved at oprette og destruere dyre ressourcer som databaseforbindelser.
Disse mønstre er afgørende for at bygge applikationer med høj ydeevne og effektiv ressourceudnyttelse!
Lær Ren arkitektur og designmønstre i praksis med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 12
- Lektioner
- 48
Ofte stillede spørgsmål
Er lektionen “Prototype og Object Pool” gratis?
Ja — hele teksten til “Prototype og Object Pool” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Ren arkitektur og designmønstre i praksis-kurset, skal du opgradere til CoddyKit PRO. Ren arkitektur og designmønstre i praksis-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Prototype og Object Pool”?
Lær at bruge Prototype til kloning af objekter og Object Pool til effektiv håndtering af genanvendelige ressourcer. Du øver dig i Ren arkitektur og designmønstre i praksis med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Ren arkitektur og designmønstre i praksis?
Der kræves ingen tidligere erfaring. Ren arkitektur og designmønstre i praksis på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Prototype og Object Pool”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Ren arkitektur og designmønstre i praksis-lektion?
Ja. Alle Ren arkitektur og designmønstre i praksis-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Singleton og Factory Method
- Abstract Factory og Builder
- Prototype og Object Pool
- Dependency injection som creational-teknik