Singleton og Factory Method
Implementér Singleton-mønstret til unikke instanser og Factory Method til fleksibel oprettelse af objekter.
Singleton og Factory Method er en gratis Ren arkitektur og designmønstre i praksis-lektion på CoddyKit. Dette er lektion 1 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.
Introduktion til Creational-mønstre
Velkommen til vores lektion om Creational-designmønstre! Disse mønstre handler om, hvordan objekter oprettes.
De hjælper os med at håndtere oprettelsen af objekter på en måde, der gør vores systemer mere fleksible og robuste. I stedet for at oprette objekter direkte overalt bruger vi mønstre til at styre processen.
Singleton: Kun én instans
Singleton-mønsteret sikrer, at en klasse kun har én instans, og giver et globalt adgangspunkt til denne instans.
- Det er nyttigt til ressourcer, der skal være unikke, f.eks. en konfigurationsadministrator eller en logger.
- For at opnå dette har klassen typisk en privat konstruktør og en statisk metode, der returnerer den enkelte instans.
Opbygning af en grundlæggende Singleton
Her er et enkelt eksempel på en Singleton. Bemærk den private konstruktør og metoden static getInstance().
Metoden getInstance() kontrollerer, om der allerede findes en instans. Hvis ikke, opretter den en. Ellers returnerer den den eksisterende instans.
public class SimpleLogger {
private static SimpleLogger instance;
// Private constructor to prevent direct instantiation
private SimpleLogger() {
System.out.println("SimpleLogger instance created!");
}
public static SimpleLogger getInstance() {
if (instance == null) {
instance = new SimpleLogger();
}
return instance;
}
public void log(String message) {
System.out.println("LOG: " + message);
}
}
public class Main {
public static void main(String[] args) {
SimpleLogger logger1 = SimpleLogger.getInstance();
logger1.log("Application starting up.");
SimpleLogger logger2 = SimpleLogger.getInstance();
logger2.log("Processing user request.");
if (logger1 == logger2) {
System.out.println("Both logger references point to the same instance!");
}
}
}Singleton: Trådsikker adgang
Den grundlæggende Singleton kan give problemer i miljøer med flere tråde. Hvis flere tråde kalder getInstance() samtidig, mens instance er null, kan der blive oprettet mere end én instans.
Vi kan gøre den trådsikker ved at bruge nøgleordet synchronized på metoden getInstance(). Det sikrer, at kun én tråd kan udføre den ad gangen.
public class ThreadSafeLogger {
private static ThreadSafeLogger instance;
private ThreadSafeLogger() {
System.out.println("ThreadSafeLogger instance created!");
}
public static synchronized ThreadSafeLogger getInstance() {
if (instance == null) {
instance = new ThreadSafeLogger();
}
return instance;
}
public void log(String message) {
System.out.println("TS_LOG: " + message);
}
}
public class Main {
public static void main(String[] args) {
// In a real app, threads would access this concurrently.
// Here, we just show it works correctly sequentially.
ThreadSafeLogger tsLogger1 = ThreadSafeLogger.getInstance();
tsLogger1.log("Task A completed.");
ThreadSafeLogger tsLogger2 = ThreadSafeLogger.getInstance();
tsLogger2.log("Task B started.");
if (tsLogger1 == tsLogger2) {
System.out.println("Thread-safe instances are the same!");
}
}
}Anvendelsesområder for Singleton
Hvornår bør du overveje at bruge Singleton-mønsteret?
- Konfigurationsadministrator: Til at opbevare programindstillinger og sikre, at alle dele af appen bruger de samme indstillinger.
- Logger: Til én samlet logningstjeneste, der skriver hændelser fra programmet.
- Forbindelsespool til databasen: Til effektivt at administrere et begrænset antal databaseforbindelser i hele programmet.
Problemet: Hardkodet oprettelse
Lad os nu se på Factory Method-mønsteret. Forestil dig, at du har kode, der opretter objekter direkte, f.eks. new Car() eller new Truck().
Hvad sker der, hvis du skal tilføje en ny køretøjstype eller ændre, hvordan en Car oprettes? Du skulle finde og opdatere alle steder i koden, hvor disse objekter oprettes. Det gør koden ufleksibel og svær at vedligeholde!
Factory Method: Abstraktion af oprettelse
Factory Method-mønsteret løser dette ved at definere et interface eller en abstrakt klasse til oprettelse af et objekt, mens underklasserne afgør, hvilken klasse der skal instansieres.
- Det uddelegerer oprettelsen af objekter til specialiserede "factory"-metoder.
- Det fremmer løs kobling ved at lade klientkode arbejde med interfaces i stedet for konkrete klasser.
Opbygning med Factory Method
Lad os oprette et system til forskellige transporttyper. Vi definerer et interface Transport, konkrete transportklasser og derefter en TransportFactory med en factory-metode.
Hver specifik factory (f.eks. CarFactory) ved, hvordan dens specifikke produkt skal oprettes.
// Product Interface
interface Transport {
void deliver();
}
// Concrete Products
class Truck implements Transport {
@Override
public void deliver() {
System.out.println("Deliver by land in a truck.");
}
}
class Ship implements Transport {
@Override
public void deliver() {
System.out.println("Deliver by sea in a ship.");
}
}
// Creator Interface (with Factory Method)
abstract class Logistics {
public void planDelivery() {
Transport t = createTransport();
t.deliver();
}
// The Factory Method
public abstract Transport createTransport();
}
// Concrete Creators
class RoadLogistics extends Logistics {
@Override
public Transport createTransport() {
return new Truck();
}
}
class SeaLogistics extends Logistics {
@Override
public Transport createTransport() {
return new Ship();
}
}
public class Main {
public static void main(String[] args) {
Logistics roadLogistics = new RoadLogistics();
roadLogistics.planDelivery(); // Outputs: Deliver by land in a truck.
Logistics seaLogistics = new SeaLogistics();
seaLogistics.planDelivery(); // Outputs: Deliver by sea in a ship.
}
}Fordele ved Factory Method
Factory Method-mønsteret giver flere vigtige fordele i dit softwaredesign:
- Løs kobling: Din klientkode arbejder kun med interfacet
Logistics, ikke med de specifikke klasserTruckellerShip. - Udvidelsesmuligheder: Du kan nemt tilføje nye transporttyper (f.eks.
AirLogisticsmedPlane) uden at ændre den eksisterendeLogistics- eller klientkode. - Enkelt ansvar: Ansvaret for at oprette objekter flyttes til dedikerede factory-klasser og -metoder.
Test din viden
Lad os teste din forståelse af Singleton- og Factory Method-mønstrene.
Opsummering: Singleton og Factory
Godt arbejde! I denne lektion gennemgik vi to effektive creational-designmønstre:
- Singleton: Sikrer, at en klasse kun har én instans, og giver et globalt adgangspunkt. Husk at overveje trådsikkerhed!
- Factory Method: Uddelegerer oprettelsen af objekter til underklasser, fremmer løs kobling og gør koden mere udvidelig.
Disse mønstre er grundlæggende, når du bygger fleksibel og vedligeholdelig software. Derefter dykker vi ned i flere creational-mønstre som Abstract Factory og Builder!
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 “Singleton og Factory Method” gratis?
Ja — hele teksten til “Singleton og Factory Method” 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 “Singleton og Factory Method”?
Implementér Singleton-mønstret til unikke instanser og Factory Method til fleksibel oprettelse af objekter. 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 1 af 4.
Hvor lang tid tager lektionen “Singleton og Factory Method”?
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