Το μοτίβο σχεδιασμού εργοστασιακών (ή εργοστασιακής μεθόδου) ειδικεύεται στην ανάθεση και την ενθυλάκωση. Αυτό το μοτίβο επιτρέπει σε μια υπερκλάση να αναβάλλει την παρουσίαση σε υποκλάσεις. Αυτό συμβαίνει επειδή η κλάση που περιέχει το μοτίβο της κύριας εργοστασιακής μεθόδου είναι αφηρημένη.
Η αρχική έκδοση της εργοστασιακής μεθόδου λαμβάνει τη μορφή μιας μη εφαρμοσμένης μεθόδου επειδή δεν γνωρίζει το προϊόν που θα δημιουργήσει. Η εργοστασιακή μέθοδος μπορεί να γνωρίζει ότι δημιουργεί κάποιο προϊόν, αλλά δεν γνωρίζει τα συγκεκριμένα χαρακτηριστικά του προϊόντος που θα δημιουργήσει. Αυτή η γνώση είναι διαθέσιμη μόνο στις αντίστοιχες υποκατηγορίες. Επομένως, η ευθύνη για την εφαρμογή της εργοστασιακής μεθόδου και τη δημιουργία κατάλληλων αντικειμένων είναι αποκλειστικά ευθύνη μιας υποκλάσης.
Εφαρμογή του Factory Design Pattern στην Java
Αυτό το άρθρο χρησιμοποιεί ένα δείγμα εφαρμογής δημιουργίας αναφοράς σχολίων. Αυτή η εφαρμογή χρησιμοποιεί τους διαφορετικούς τύπους σχολίων που λαμβάνει μια εταιρεία (για ένα νέο σνακ) για να δημιουργήσει συγκεκριμένες αναφορές (χρησιμοποιώντας την εργοστασιακή μέθοδο). Επομένως, το εργοστασιακό μοτίβο θα δημιουργήσει συγκεκριμένα σχόλια (ή αναφορά σχολίων), χρησιμοποιώντας ως βάση την ακόλουθη κύρια κατηγορία προϊόντων:
δημόσιοαφηρημένητάξηΑνατροφοδότηση{
ιδιωτικός Σειρά κριτικόςΌνομα;
ιδιωτικός Σειρά κριτικήΜήνυμα;
ιδιωτικόςενθ αναθεώρηση Βαθμολογίες;
δημόσιοΑνατροφοδότηση(Συμβολοσειράς κριτήςΌνομα, Μήνυμα κριτικής συμβολοσειράς, ενθ αξιολογήσεις αναθεώρησης){
Αυτό.reviewerName = reviewerName;
Αυτό.reviewMessage = reviewMessage;
Αυτό.reviewRatings = reviewRatings;
}
δημόσιο Σειρά getReviewerName(){
ΕΠΙΣΤΡΟΦΗ κριτικόςΌνομα;
}
δημόσιοκενόςsetReviewerName(Όνομα κριτικού συμβολοσειράς){
Αυτό.reviewerName = reviewerName;
}
δημόσιο Σειρά getReviewMessage(){
ΕΠΙΣΤΡΟΦΗ κριτικήΜήνυμα;
}
δημόσιοκενόςsetReviewMessage(Μήνυμα αναθεώρησης συμβολοσειράς){
Αυτό.reviewMessage = reviewMessage;
}
δημόσιοενθgetReviewRatings(){
ΕΠΙΣΤΡΟΦΗ αναθεώρηση Βαθμολογίες;
}
δημόσιοκενόςsetReviewRatings(ενθ αξιολογήσεις αναθεώρησης){
Αυτό.reviewRatings = reviewRatings;
}
}
Κάθε σχόλιο θα έχει τρεις υποχρεωτικές ιδιότητες, ένα όνομα κριτή, ένα μήνυμα κριτικής και μια βαθμολογία αριθμού (από ένα έως πέντε) για το νέο σνακ. Οι διαφορετικοί τύποι σχολίων που θα λάβει η εταιρεία θα προέρχονται από ένα από τα τρία κανάλια:
Τάξη σχολίων μέσω email
δημόσιοτάξηEmail FeedbackεκτείνεταιΑνατροφοδότηση{
ιδιωτικός Σειρά reviewerEmail;
δημόσια ανατροφοδότηση ηλεκτρονικού ταχυδρομείου (Σειρά κριτήςΌνομα, Σειρά reviewMessage, int review Βαθμολογίες, Σειρά email κριτικού) {
σούπερ(reviewerName, reviewMessage, reviewRatings);
Αυτό.reviewerEmail = reviewerEmail;
}
δημόσιο Σειρά getReviewerEmail(){
ΕΠΙΣΤΡΟΦΗ reviewerEmail;
}
δημόσιοκενόςsetReviewerEmail(Email κριτικού συμβολοσειράς){
Αυτό.reviewerEmail = reviewerEmail;
}
}
Τάξη σχολίων αλληλογραφίας
δημόσιοτάξηΑλληλογραφίαεκτείνεταιΑνατροφοδότηση{
ιδιωτικός Σειρά διεύθυνση επιστροφής;
δημόσια ανατροφοδότηση αλληλογραφίας (Σειρά κριτήςΌνομα, Σειρά reviewMessage, int review Βαθμολογίες, Σειρά διεύθυνση επιστροφής) {
σούπερ(reviewerName, reviewMessage, reviewRatings);
Αυτό.returnAddress = returnAddress;
}δημόσιο Σειρά getReturnAddress(){
ΕΠΙΣΤΡΟΦΗ διεύθυνση επιστροφής;
}
δημόσιοκενόςsetReturnAddress(Διεύθυνση επιστροφής συμβολοσειράς){
Αυτό.returnAddress = returnAddress;
}
}
Τάξη ανατροφοδότησης μέσων κοινωνικής δικτύωσης
δημόσιοτάξηSocialMediaFeedbackεκτείνεταιΑνατροφοδότηση{
ιδιωτικός Σειρά κριτικόςΧειρισμός;
δημόσια ανατροφοδότηση μέσων κοινωνικής δικτύωσης (Σειρά κριτήςΌνομα, Σειρά reviewMessage, int review Βαθμολογίες, Σειρά κριτικός Handle) {
σούπερ(reviewerName, reviewMessage, reviewRatings);
Αυτό.reviewerHandle = reviewerHandle;
}
δημόσιο Σειρά getReviewerHandle(){
ΕΠΙΣΤΡΟΦΗ κριτικόςΧειρισμός;
}
δημόσιοκενόςsetReviewerHandle(String reviewerHandle){
Αυτό.reviewerHandle = reviewerHandle;
}
}
Θα παρατηρήσετε ότι κάθε υποκατηγορία σχολίων έχει μια μοναδική ιδιότητα. Αυτό σημαίνει ότι θα χρειαστεί να δημιουργήσετε την αναφορά για κάθε τύπο σχολίων χρησιμοποιώντας τουλάχιστον μία ιδιότητα που είναι μοναδική για αυτόν τον τύπο.
Το Απλό Εργοστάσιο
Ένα απλό εργοστάσιο είναι μια δημοφιλής προσέγγιση για τη χρήση του μοτίβου εργοστασιακής σχεδίασης. Αυτή η προσέγγιση συνεπάγεται την ομαδοποίηση όλων των διαφορετικών ανατροφοδοτήσεων (ή προϊόντων) σε μια μέθοδο (το απλό εργοστάσιο) και την επιλογή της κατάλληλης ανατροφοδότησης με βάση μια παράμετρο.
δημόσιοτάξηFeedbackReportFactory{
δημόσιο Ανατροφοδότηση makeFeedback(Τύπος ανάδρασης συμβολοσειράς){
Ανατροφοδότηση ανατροφοδότηση = μηδενικό;
αν(feedbackType.equals("ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ")) {
ανατροφοδότηση = νέος EmailFeedback();
}αλλούαν (feedbackType.equals("ταχυδρομείο")) {
ανατροφοδότηση = νέος MailFeedback();
}αλλούαν (feedbackType.equals("κοινωνικός")) {
ανατροφοδότηση = νέος SocialMediaFeedback();
}
ΕΠΙΣΤΡΟΦΗ ανατροφοδότηση;
}
}
Ωστόσο, η απλή εργοστασιακή προσέγγιση δεν είναι το εργοστασιακό μοτίβο σχεδιασμού, ούτε είναι ένα σχέδιο σχεδίασης. Είναι περισσότερο σαν ιδέα σχεδιασμού.
Η εργοστασιακή μέθοδος
Η εργοστασιακή μέθοδος είναι η αληθινή αναπαράσταση του σχεδίου σχεδίου. Χρησιμοποιώντας την εργοστασιακή μέθοδο, η αναμόρφωση FeedbackReportFactoryΚλάση Java θα περιέχει τώρα τον ακόλουθο κώδικα:
δημόσιοαφηρημένητάξηFeedbackReportFactory{
δημόσιοαφηρημένηκενόςmakeFeedbackReport(Σχόλια ανατροφοδότησης);
}
Μπορείτε να ορίσετε τη δομή του εργοστασιακού σχεδίου σχεδίου με το ακόλουθο διάγραμμα κλάσεων:
Από το παραπάνω διάγραμμα θα δείτε ότι μια αφηρημένη κλάση (ή διεπαφή) θα περιέχει μια αφηρημένη έκδοση της εργοστασιακής μεθόδου. Έτσι, οι συγκεκριμένες εργοστασιακές κλάσεις που επεκτείνουν την αφηρημένη κλάση θα εφαρμόσουν την εργοστασιακή μέθοδο, χρησιμοποιώντας ιδιότητες που είναι μοναδικές για το προϊόν που θέλει να δημιουργήσει. Θα πρέπει επίσης να σημειώσετε ότι οποιαδήποτε κατηγορία εργοστασίου σκυροδέματος πρέπει να δημιουργεί ένα ή περισσότερα προϊόντα.
Το δείγμα εφαρμογής έχει τρία σχετικά αλλά μοναδικά προϊόντα. Κάθε τύπος σχολίων έχει τουλάχιστον μία μοναδική ιδιότητα. Έτσι, η εφαρμογή θα πρέπει να έχει τρία εργοστάσια σκυροδέματος για την κατασκευή κάθε προϊόντος.
Email Feedback Factory
δημόσιοτάξηΑναφορά Email FeedbackεκτείνεταιFeedbackReportFactory{
Ανατροφοδότηση μέσω email.
@Καταπατώ
δημόσιοκενόςmakeFeedbackReport(Σχόλια ανατροφοδότησης){
Αυτό.feedback = (EmailFeedback) ανατροφοδότηση;
Σύστημα.έξω.println("\nΑναφοράΓιαΑνατροφοδότησηΜέσωΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ" +
"\nΌνομα κριτικού: " +Αυτό.feedback.getReviewerName() +
"\nΣχόλια: " + Αυτό.feedback.getReviewMessage() +
"\nΒαθμολογίες: " + Αυτό.feedback.getReviewRatings() +
"\nΔιεύθυνση Emal: " + Αυτό.feedback.getReviewerEmail());
}
}
Mail Feedback Factory
δημόσιοτάξηΑναφορά MailFeedbackεκτείνεταιFeedbackReportFactory{
Ανατροφοδότηση αλληλογραφίας.
@Καταπατώ
δημόσιοκενόςmakeFeedbackReport(Σχόλια ανατροφοδότησης){
Αυτό.feedback = (MailFeedback) ανατροφοδότηση;
Σύστημα.έξω.println("\nΑναφοράΓιαΑνατροφοδότησηΜέσωΤαχυδρομείο" +
"\nΌνομα κριτικού: " +Αυτό.feedback.getReviewerName() +
"\nΣχόλια: " + Αυτό.feedback.getReviewMessage() +
"\nΒαθμολογίες: " + Αυτό.feedback.getReviewRatings() +
"\nΤαχυδρομική διεύθυνση: " + Αυτό.feedback.getReturnAddress());
}
}
Social Media Feedback Factory
δημόσιοτάξηΑναφορά SocialMediaFeedbackεκτείνεταιFeedbackReportFactory{
Σχόλια SocialMediaFeedback.
@Καταπατώ
δημόσιοκενόςmakeFeedbackReport(Σχόλια ανατροφοδότησης){
Αυτό.feedback = (SocialMediaFeedback) ανατροφοδότηση;
Σύστημα.έξω.println("\nΑναφοράΓιαΑνατροφοδότησηΜέσωΚοινωνικόςΜεσο ΜΑΖΙΚΗΣ ΕΝΗΜΕΡΩΣΗΣ" +
"\nΌνομα κριτικού: " + Αυτό.feedback.getReviewerName() +
"\nΣχόλια: " + Αυτό.feedback.getReviewMessage() +
"\nΒαθμολογίες: " + Αυτό.feedback.getReviewRatings() +
"\nΧειρισμός μέσων κοινωνικής δικτύωσης αναθεωρητή: " + Αυτό.feedback.getReviewerHandle());
}
}
Δοκιμή του δείγματος εφαρμογής
Τώρα μπορείτε να χρησιμοποιήσετε τις αντίστοιχες εργοστασιακές μεθόδους για να δημιουργήσετε μικροσκοπικές αναφορές σχετικά με τα σχόλια που λαμβάνετε από τα διάφορα κανάλια. Μπορείς δοκιμάστε την εφαρμογή χρησιμοποιώντας το JUnit, ή μπορείτε να δημιουργήσετε μια κατηγορία προγραμμάτων οδήγησης:
δημόσιοτάξηΚύριος{
δημόσιοστατικόςκενόςκύριος(String[] args){
Ανατροφοδότηση ανατροφοδότηση = νέος Email Feedback("Νίκος", "Υπέροχο προϊόν!", 5, "[email protected]");
Ανατροφοδότηση ανατροφοδότηση2 = νέος Ανατροφοδότηση αλληλογραφίας ("Γιάννης", "Το προϊόν είναι καλό αλλά όχι κάτι που θα αγόραζα τακτικά", 4, "πρώτος δρόμος");
Ανατροφοδότηση ανατροφοδότηση3 = νέος Ανατροφοδότηση μέσων κοινωνικής δικτύωσης ("Ιωάννα", "Δεν είναι για μένα", 2, "@janey");
FeedbackReportFactory εργοστάσιο = νέος EmailFeedbackReport();
FeedbackReportFactory factory2 = νέος MailFeedbackReport();
FeedbackReportFactory factory3 = νέος SocialMediaFeedbackReport();
εργοστάσιο.makeFeedbackReport(ανατροφοδότηση);
εργοστάσιο 2.makeFeedbackReport(ανατροφοδότηση 2);
εργοστάσιο 3.makeFeedbackReport(ανατροφοδότηση 3);
}
Η παραπάνω κύρια κατηγορία χρησιμοποιεί τα αντίστοιχα εργοστάσια για να δημιουργήσει τρεις αναφορές, παράγοντας την ακόλουθη έξοδο στην κονσόλα:
Πλεονεκτήματα της χρήσης του μοτίβου εργοστασιακής σχεδίασης
Το εργοστασιακό σχέδιο σχεδίασης προάγει την ευελιξία του σχεδιασμού, όπου χρησιμοποιείτε διεπαφές (ή αφηρημένες κλάσεις) για να δημιουργήσετε συγκεκριμένες κατηγορίες. Προωθεί επίσης την επεκτασιμότητα μέσω του πολυμορφισμού, επιτρέποντας σε νέες κλάσεις να υλοποιήσουν την υπάρχουσα διεπαφή καθώς επεκτείνεται η εφαρμογή.
Όταν χρησιμοποιείτε το εργοστασιακό μοτίβο σχεδίασης, χρησιμοποιείτε δύο σημαντικές αρχές σχεδίασης: Ανοιχτό-κλειστό και Αντιστροφή ελέγχου (IoC).