Το μονότονο μοτίβο είναι ένα από τα πιο απλά σχέδια σχεδίασης. Μια κλάση που χρησιμοποιεί το μοτίβο σχεδίασης singleton έχει ένα μόνο παράδειγμα που διαχειρίζεται από μόνη της. Αυτή η κλάση εμποδίζει οποιαδήποτε άλλη κλάση να δημιουργήσει μια παρουσία της.

Μια κλάση singleton παρέχει επίσης ένα ενιαίο παγκόσμιο σημείο πρόσβασης στο στιγμιότυπο που δημιουργεί. Έτσι, κάθε κλάση που θέλει μια παρουσία μιας κλάσης singleton, πρέπει να έχει πρόσβαση σε αυτήν μέσω του μοναδικού σημείου πρόσβασης.

Η εξαιρετική υποστήριξη της Java για αντικειμενοστραφή προγραμματισμό καθιστά εύκολη τη χρήση του μοτίβου σχεδιασμού singleton.

Υλοποίηση του μοτίβου Singleton με χρήση Java

Υπάρχουν πολλοί τρόποι για την υλοποίηση του μοτίβου singleton στην Java. Οι πρόθυμες και τεμπέλικες προσεγγίσεις είναι κοινές παραλλαγές. Κάθε μία από αυτές τις προσεγγίσεις έχει τα δικά της πλεονεκτήματα και μειονεκτήματα. Επομένως, η μέθοδος που θα επιλέξετε να χρησιμοποιήσετε θα πρέπει να εξαρτάται από τον τρόπο λειτουργίας της εφαρμογής σας.

instagram viewer

The Eager Approach

Η εφαρμογή του μοτίβου singleton με την ανυπόμονη προσέγγιση σημαίνει ότι η κλάση δημιουργεί μια νέα παρουσία από μόνη της όταν φορτώνει.

δημόσιοτάξηEagerSingleton{
ιδιωτικόςστατικός EagerSingleton παράδειγμα = νέος EagerSingleton();

ιδιωτικόςEagerSingleton(){}

δημόσιοστατικός EagerSingleton getInstance(){
ΕΠΙΣΤΡΟΦΗ παράδειγμα;
}
}

ο EagerSingletonΚλάση Java δημιουργεί ένα νέο στιγμιότυπο του εαυτού του καθώς φορτώνει. Εκχωρεί αυτήν την παρουσία στο ιδιωτικό στατικό μεταβλητή παράδειγμα, το οποίο είναι προσβάσιμο μόνο στην κατηγορία singleton. Το μόνο σημείο εξωτερικής πρόσβασης στη μεταβλητή στιγμιότυπου είναι μέσω του getInstance() μέθοδος. Αυτή η μέθοδος επιστρέφει το στιγμιότυπο της κλάσης που δημιουργήθηκε προηγουμένως.

Αυτή η προσέγγιση είναι εξαιρετική καθώς αποτρέπει την πολυνηματική πρόβλημα, το οποίο είναι μία από τις μεγαλύτερες προκλήσεις του μοτίβου singleton. Επιλύει το πρόβλημα πολλαπλών νημάτων δημιουργώντας ένα νέο στιγμιότυπο από μόνο του προτού οποιοδήποτε νέο νήμα έχει πρόσβαση στη μεταβλητή παρουσίας του. Αυτό εγγυάται ότι κάθε νήμα θα έχει πρόσβαση μόνο στην ίδια παρουσία.

Ωστόσο, η πρόθυμη προσέγγιση είναι πρακτική μόνο εάν η εφαρμογή σας χρησιμοποιεί μια παρουσία της κλάσης singleton καθώς ξεκινά να εκτελείται. Διαφορετικά, θα δημιουργήσετε ένα αντικείμενο πριν το χρειαστεί η εφαρμογή σας, χρησιμοποιώντας άσκοπα πόρους.

Η Τεμπέλης Προσέγγιση

Η τεμπέλης προσέγγιση είναι η λύση στο πρόβλημα της πρόθυμης προσέγγισης. Σας επιτρέπει να δημιουργήσετε μια νέα παρουσία μιας κλάσης singleton μόνο όταν το χρειάζεται το πρόγραμμά σας.

δημόσιοτάξηLazySingleton{
ιδιωτικόςπτητικόςστατικός Παράδειγμα LazySingleton;

ιδιωτικόςLazySingleton(){}

δημόσιοστατικός LazySingleton getInstance(){
αν (παράδειγμα == μηδενικό) {
συγχρονισμένα (LazySingleton.τάξη) {
αν (παράδειγμα == μηδενικό) {
παράδειγμα = νέος LazySingleton();
}
}
}

ΕΠΙΣΤΡΟΦΗ παράδειγμα;
}
}

Η τεμπέλης προσέγγιση λύνει το πρόβλημα πολλαπλών νημάτων χρησιμοποιώντας το συγχρονισμένα λέξη-κλειδί. Αυτό εμποδίζει δύο νήματα να αποκτήσουν πρόσβαση στη μεταβλητή παρουσίας ταυτόχρονα. Ωστόσο, το Synchronized είναι ακριβό, επομένως η εφαρμογή το χρησιμοποιεί μόνο μία φορά, όταν καλεί για πρώτη φορά το getInstance().

Πότε να χρησιμοποιήσετε το μοτίβο Singleton

Το μοτίβο Singleton είναι χρήσιμο σε πολλά σενάρια, για τη δημιουργία πλαισίων διαλόγου, τη διαχείριση ρυθμίσεων μητρώου ή τη διαχείριση ομάδων νημάτων.

Μια άλλη κοινή χρήση για το μοτίβο singleton είναι η δημιουργία μιας κεντρικής κλάσης που διαχειρίζεται τις συνδέσεις βάσης δεδομένων.