Σε αυτό το σεμινάριο, θα συνεχίσουμε να μαθαίνουμε μοτίβα σχεδίασης και να καλύψουμε το Αφηρημένο σχέδιο εργοστασίου ή Αφηρημένο εργοστασιακό σχέδιο.Είναι ένα από τα μοτίβα δημιουργίας και μπορούμε να βρούμε τις χρήσεις του σε όλες σχεδόν τις βιβλιοθήκες στο JDK, Spring framework.Θα καταλάβουμε τι σημαίνει αυτό το μοτίβο με τη χρήση μιας εφαρμογής Java. Στη συνέχεια θα δούμε τα σχεδιαστικά οφέλη αυτού του αφηρημένου εργοστασιακού μοτίβου.
Αφηρημένο εργοστασιακό σχέδιο
ο Αφηρημένο εργοστασιακό μοτίβο ή μοτίβο σχεδίασης Abstract Factory Method είναι ένα από τα δημιουργικά μοτίβα σχεδιασμού. Είναι πολύ παρόμοιο με το σχέδιο Factory και προσθέτει ένα άλλο επίπεδο αφαίρεσης στο εργοστάσιο. Το αναφέραμε επίσης ως το εργοστάσιο των εργοστασίων που λειτουργεί ως υπερ-εργοστάσιο που δημιουργούν άλλα εργοστάσια. Σε αυτό το μοτίβο σχεδίασης, μια διεπαφή δημιουργεί ένα εργοστάσιο των σχετικών αντικειμένων χωρίς να προσδιορίζει τις κλάσεις τους. Μπορούμε να δώσουμε σε κάθε ένα από τα εργοστάσια τα αντικείμενα σύμφωνα με το σχέδιο του εργοστασίου.
Ας το καταλάβουμε αυτό με ένα πολύ απλό παράδειγμα της πραγματικής ζωής. Έχουμε δύο κατηγορίες Ζώων, κατοικίδιων και άγριων. Τώρα στα οικόσιτα ζώα έχουμε γάτες και σκύλους ενώ στα άγρια ζώα έχουμε Τίγρεις και λιοντάρια. Εδώ το Animal είναι μια διεπαφή (το υπερ-εργοστάσιο) που επιστρέφει το Domestic και το Wild είναι εργοστάσια.

1. Αφηρημένο σχέδιο σχεδίασης σε Java
Για να καταλάβετε το Αφηρημένο εργοστασιακό σχέδιο καλύτερα, ας πάρουμε ένα παράδειγμα java. Όπως αναφέρθηκε παραπάνω, το σούπερ εργοστάσιο στο Αφηρημένο σχέδιο εργοστασίου μπορεί να είναι διεπαφές, αφηρημένες κλάσεις ή μη τελικές κλάσεις. Ας πάρουμε ένα παράδειγμα του λειτουργικού συστήματος Mobile ως Abstract Factory και, με το Android και την Apple ως εργοστάσιο, και επωνυμίες όπως η Sony, το iPhone, το OnePlus και η Lava ως πραγματικές συγκεκριμένες υλοποιήσεις.
1.1. Super Factory
Θα δούμε πρώτα το Abstract Factory και αυτό θα έχει μια ενιαία αφηρημένη μέθοδο getMobile()
. Θα έχει δύο εργοστασιακές κατηγορίες επεκτείνοντάς το. Αυτό είναι το εργοστάσιο των εργοστασίων μας.
/**
* Abstract Factory - Factory of Factories
*/
public abstract class AbstractFactory {
abstract IMobile getMobile(String mobileModel);
}
1.2. Εργοστασιακός Παραγωγός
Αυτή η κατηγορία θα παράγει τα πραγματικά εργοστάσια της Apple και του Android. Εχει ένα getFactory()
μέθοδος που λαμβάνει μια είσοδο boolean (μπορεί να είναι και είσοδος συμβολοσειράς) για να ελέγξει εάν ο πελάτης χρειάζεται ένα εργοστάσιο κινητής τηλεφωνίας της Apple ή το εργοστάσιο για κινητά Android.
/**
* Factory Producer
*/
public class MpbileFactoryProducer {
public static AbstractFactory getFactory(boolean isApple) {
if (isApple) {
return new AppleMobileFactory();
} else {
return new AndroidMobileFactory();
}
}
}
2. Factories – Android και Apple
Θα έχουμε δύο εργοστασιακές κατηγορίες, AndroidMobileFactory
και AppleMobileFactory
και θα επεκτείνουν το σούπερ εργοστάσιο και θα παρέχουν την πραγματική υλοποίηση σύμφωνα με τη συμβολή του πελάτη στις επωνυμίες κινητής τηλεφωνίας.
2.1. AndroidMobileFactory
Αυτή η εργοστασιακή κατηγορία παράγει τις συγκεκριμένες κατηγορίες κινητών που υποστηρίζουν λειτουργικό σύστημα Android και τη μέθοδο του getMobile()
παίρνει μια είσοδο συμβολοσειράς ως όνομα της επωνυμίας του κινητού και στη συνέχεια δίνει το συγκεκριμένο αντικείμενο πίσω στο πρόγραμμα πελάτη.
/**
* Android Mobile Factory
*/
public class AndroidMobileFactory extends AbstractFactory {
@Override
public IMobile getMobile(String mobileModel) {
if (mobileModel.equalsIgnoreCase("Oneplus")) {
return new OnePlus();
} else if (mobileModel.equalsIgnoreCase("Sony")) {
return new Sony();
} else if (mobileModel.equalsIgnoreCase("Lava")) {
return new Lava();
}
return null;
}
}
2.2. AppleMobileFactory
Αυτή η εργοστασιακή κατηγορία είναι υπεύθυνη για την παραγωγή των συγκεκριμένων κατηγοριών κινητών τηλεφώνων που υποστηρίζουν το Apple OS και τη μέθοδο του getMobile()
παίρνει μια είσοδο συμβολοσειράς ως όνομα της επωνυμίας του κινητού και στη συνέχεια δίνει το συγκεκριμένο αντικείμενο πίσω στο πρόγραμμα πελάτη.
/**
* Apple Mobile Factory
*/
public class AppleMobileFactory extends AbstractFactory {
@Override
public IMobile getMobile(String mobileModel) {
if (mobileModel.equalsIgnoreCase("iphone")) {
return new Iphone();
}
return null;
}
}
2.3. Mobile Interface
Αυτή η διεπαφή είναι η υπερκατηγορία για όλα τα κινητά τηλέφωνα και έχει μία μόνο μέθοδο brandName()
οι κλάσεις υλοποίησης (π.χ. Sony, iPhone, κ.λπ.) θα παρακάμψουν αυτήν τη μέθοδο και θα παρέχουν μια επωνυμία στο πρόγραμμα-πελάτη.
/**
* Mobile
*/
public interface IMobile {
void brandName();
}
2.4. Μαθήματα σκυροδέματος
Το τελευταίο βήμα στο Abstract Factory Design Pattern είναι οι συγκεκριμένες κατηγορίες. Αυτές οι κλάσεις δημιουργούν το πραγματικό κινητό αντικείμενο. Δείτε πώς θα μοιάζουν:
/**
* Iphone Mobile
*/
public class Iphone implements IMobile {
@Override
public void brandName() {
System.out.println("The brand name is Iphone");
}
}
/**
* Sony Mobile
*/
public class Sony implements IMobile {
@Override
public void brandName() {
System.out.println("The brand name is Sony");
}
}
/**
* OnePlus Mobile
*/
public class OnePlus implements IMobile {
@Override
public void brandName() {
System.out.println("The brand name is OnePlus");
}
}
/**
* Nokia Mobile Concrete Class
*/
public class Lava implements IMobile {
@Override
public void brandName() {
System.out.println("The brand name is Lava");
}
}
3. Πρόγραμμα πελάτη
Ας δούμε το δείγμα προγράμματος πελάτη για να καλέσουμε την εργοστασιακή κλάση και να λάβουμε το απαιτούμενο αντικείμενο σύμφωνα με την είσοδο.
/**
* Client Class
*/
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
AbstractFactory abstractFactory1 = MpbileFactoryProducer.getFactory(false);
IMobile onePlus = abstractFactory1.getMobile("Oneplus");
onePlus.brandName();
IMobile sony = abstractFactory1.getMobile("Sony");
sony.brandName();
IMobile lava = abstractFactory1.getMobile("Lava");
lava.brandName();
AbstractFactory abstractFactory2 = MpbileFactoryProducer.getFactory(true);
IMobile iphone = abstractFactory2.getMobile("iPhone");
iphone.brandName();
}
}
Παραγωγή
The brand name is OnePlus
The brand name is Sony
The brand name is Lava
The brand name is iPhone
Εδώ είναι το διάγραμμα κλάσης υψηλού επιπέδου για το Abstract Factory Pattern.

4. Αφηρημένα εργοστασιακά πλεονεκτήματα
Ας δούμε μερικά πλεονεκτήματα από τη χρήση αυτού του μοτίβου:
- Εφόσον το αφηρημένο εργοστάσιο (ή εργοστασιακό) ενσωματώνει τη δημιουργία αντικειμένων, μπορείτε να ελέγξετε τις κατηγορίες αντικειμένων που δημιουργεί μια εφαρμογή. Επίσης, ο πελάτης δεν γνωρίζει τη συγκεκριμένη υλοποίηση και μπορεί να μεταβεί μόνο μέσω διασύνδεσης ή αφηρημένης κλάσης.
- Το Abstract Factory Pattern προωθεί τη συνοχή μεταξύ των οικογενειών αντικειμένων, επειδή διασφαλίζει ότι εάν μια οικογένεια αντικειμένων έχει σχεδιαστεί για να συνεργάζεται, τότε η εφαρμογή χρησιμοποιεί αντικείμενα από μια οικογένεια τη φορά. Με αυτό το μοτίβο, είναι πολύ εύκολο να επιτευχθεί.
- Αν και είναι δύσκολο, το Abstract Factory Pattern επιτρέπει στην εφαρμογή να προσθέσει μια νέα οικογένεια προϊόντων και αργότερα.
- Το Abstract Factory Pattern αποφεύγει τη στενή σύζευξη μεταξύ προϊόντων σκυροδέματος και κώδικα πελάτη.
4.1. Μειονεκτήματα
Θυμηθείτε, αυτό το μοτίβο έχει πολλά πλεονεκτήματα. Ωστόσο, η προσθήκη μιας νέας οικογένειας αντικειμένων δεν θα είναι εύκολη επειδή το υπερ-εργοστάσιο του Abstract Factory (διεπαφή ή αφηρημένη κλάση) διορθώνει τις οικογένειες των αντικειμένων που μπορούν να δημιουργηθούν. Θα απαιτήσει από εμάς να αλλάξουμε το Abstract Factory και όλες τις υποκατηγορίες.
Πότε να χρησιμοποιήσετε το Abstract Factory Design;
1. Όταν το σύστημά μας περιλαμβάνει πολλές ομάδες αντικειμένων και αυτές οι ομάδες αντικειμένων μπορούν να χρησιμοποιηθούν μαζί.
2. Όταν χρειαζόμαστε μια τιμή χρόνου εκτέλεσης για να αποφασίσουμε τη συγκεκριμένη υλοποίηση ενός αντικειμένου.
3. Όταν ο πελάτης δεν ενδιαφέρεται για το πώς το σύστημα δημιουργεί και συνθέτει τα αντικείμενα.
Περίληψη
Σε αυτή την ανάρτηση, μιλήσαμε για το Αφηρημένο σχέδιο εργοστασίου ή Αφηρημένο εργοστασιακό σχέδιο. Είδαμε μερικά από τα παραδείγματα του πραγματικού κόσμου μαζί με ορισμένα πλεονεκτήματα της χρήσης αυτού του μοτίβου. Είδαμε επίσης μια υλοποίηση Java για αυτό το μοτίβο σχεδίασης. Μπορείτε πάντα να ελέγχετε το δικό μας Αποθετήριο GitHub για τον πιο πρόσφατο πηγαίο κώδικα. Ακολουθούν μερικά παραδείγματα από το JDK / Spring Framework χρησιμοποιώντας το ίδιο σχέδιο σχεδίασης.