τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Το Factory Pattern είναι ένα μοτίβο σχεδίασης που χρησιμοποιείται συνήθως στον αντικειμενοστραφή προγραμματισμόμοτίβο δημιουργίας περίπου.Το εργοστασιακό μοτίβο χρησιμοποιείται κυρίως για τη δημιουργία αντικειμένων, αλλά διαφέρει από τη χρήση του απευθείας στον κώδικα.new
Η δημιουργία λέξεων-κλειδιών είναι διαφορετική στο ότι δημιουργεί αντικείμενα μέσω μιας κοινής διεπαφής, διαχωρίζοντας έτσι τη διαδικασία δημιουργίας αντικειμένων από τη χρήση κώδικα πελάτη. Ακολουθεί μια λεπτομερής εισαγωγή στο εργοστασιακό μοτίβο:
Τα εργοστασιακά μοτίβα χωρίζονται κυρίως σε τρεις τύπους: απλό εργοστασιακό μοτίβο (στατικό εργοστασιακό μοτίβο), μοτίβο εργοστασιακής μεθόδου και αφηρημένο εργοστασιακό μοτίβο.
Απλό διάγραμμα κλάσης εργοστασιακών μοτίβων
Μοτίβο εργοστασιακής μεθόδου
αφηρημένο εργοστάσιο μοτίβο
Το εργοστασιακό μοτίβο έχει ένα ευρύ φάσμα εφαρμογών στην πραγματική ανάπτυξη, όπως συνδέσεις βάσης δεδομένων, στοιχεία ελέγχου διεπαφής χρήστη, επεξεργασία αρχείων, καταγραφή, επικοινωνίες δικτύου, ουρές μηνυμάτων, δομές δεδομένων, κρυπτογράφηση και αποκρυπτογράφηση, προώθηση μηνυμάτων και προγραμματισμός εργασιών. Σε αυτά τα σενάρια, η χρήση του εργοστασιακού μοτίβου μπορεί να διαχωρίσει τη διαδικασία δημιουργίας αντικειμένων από τη διαδικασία χρήσης, βελτιώνοντας την ευελιξία και την επεκτασιμότητα του συστήματος.
Στο απλό εργοστασιακό μοτίβο, ορίζουμε μια εργοστασιακή κλάση που μπορεί να επιστρέψει στιγμιότυπα διαφορετικών τύπων με βάση τις παραμέτρους που μεταβιβάζονται.
Παρακάτω είναι ένα παράδειγμα απλού εργοστασιακού μοτίβου γραμμένου σε Java. Θα δημιουργήσουμε ένα εργοστάσιο σχημάτων που μπορεί να παράγει στιγμιότυπα κύκλων, ορθογωνίων και τετραγώνων. Αρχικά, ορίζουμε μια διεπαφή σχήματος (Σχήμα) και πολλές συγκεκριμένες κατηγορίες (Κύκλος, Ορθογώνιο, Τετράγωνο) που υλοποιούν αυτήν τη διεπαφή.
- // 形状接口
- interface Shape {
- void draw();
- }
-
- // 圆形类
- class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Circle::draw() method.");
- }
- }
-
- // 矩形类
- class Rectangle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Rectangle::draw() method.");
- }
- }
-
- // 正方形类
- class Square implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Square::draw() method.");
- }
- }
Στη συνέχεια, ορίζουμε μια εργοστασιακή κλάση (ShapeFactory) που χρησιμοποιεί στατικές μεθόδους για τη δημιουργία αντικειμένων σχήματος.
- // 形状工厂类
- class ShapeFactory {
-
- // 使用 getShape 方法获取形状类型的对象
- public static Shape getShape(String shapeType){
- if(shapeType == null){
- return null;
- }
- if(shapeType.equalsIgnoreCase("CIRCLE")){
- return new Circle();
- } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
- return new Rectangle();
- } else if(shapeType.equalsIgnoreCase("SQUARE")){
- return new Square();
- }
-
- return null;
- }
- }
Τέλος, μπορούμε να χρησιμοποιήσουμε μια εργοστασιακή κλάση για να πάρουμε αντικείμενα σχήματος και να τα καλέσουμεdraw
μέθοδος.
- public class FactoryPatternDemo {
-
- public static void main(String[] args) {
- // 获取 Circle 的对象,并调用它的 draw 方法
- Shape shape1 = ShapeFactory.getShape("CIRCLE");
- shape1.draw();
-
- // 获取 Rectangle 的对象,并调用它的 draw 方法
- Shape shape2 = ShapeFactory.getShape("RECTANGLE");
- shape2.draw();
-
- // 获取 Square 的对象,并调用它的 draw 方法
- Shape shape3 = ShapeFactory.getShape("SQUARE");
- shape3.draw();
- }
- }
Σε αυτό το παράδειγμα,ShapeFactory
η τάξη είναι υπεύθυνη για τη δημιουργίαShape
Ένα παράδειγμα της διεπαφής.Ο κώδικας πελάτη το κάνει αυτό μεταβιβάζοντας πληροφορίες τύπου (π.χ. συμβολοσειρά).ShapeFactory
στατική μέθοδος κλάσηςgetShape
για να πάρετε ένα παράδειγμα του επιθυμητού σχήματος. Με αυτόν τον τρόπο, ο πελάτης αποσυνδέεται από την υλοποίηση της συγκεκριμένης κλάσης και συμμορφώνεται με την αρχή ανοίγματος και κλεισίματος, δηλαδή, νέες κλάσεις σχήματος μπορούν να επεκταθούν χωρίς τροποποίηση του κώδικα πελάτη. Ωστόσο, ένα σημαντικό μειονέκτημα του απλού εργοστασιακού σχεδίου είναι ότι εάν το σύστημα πρέπει να επεκταθεί με νέες οικογένειες προϊόντων (όπως χρώματα εκτός από σχήματα κ.λπ.), η εργοστασιακή κατηγορία πρέπει να τροποποιηθεί, γεγονός που παραβιάζει μέρος του ανοιχτού - κλειστή αρχή. Σε αυτήν την περίπτωση, εξετάστε το ενδεχόμενο να χρησιμοποιήσετε το μοτίβο Factory Method ή το Abstract Factory μοτίβο.
Ακόμα παίρνοντας μορφή ως παράδειγμα, χρησιμοποιούμε μεθόδους μηχανικής για να το δημιουργήσουμε.
Πρώτα ορίστε τη διεπαφή σχήματος (Προϊόν) και δημιουργήστε τρεις κλάσεις υλοποίησης.
- // 形状接口
- interface Shape {
- void draw();
- }
-
- // 圆形类
- class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Circle::draw() method.");
- }
- }
-
- // 矩形类
- class Rectangle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Rectangle::draw() method.");
- }
- }
-
- // 正方形类
- class Square implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Square::draw() method.");
- }
- }
Στη συνέχεια, ορίστε τη διεπαφή δημιουργού (Δημιουργός) και συγκεκριμένου δημιουργού (Σκυρόδεμα Δημιουργός):
- // 创建者接口
- interface ShapeFactory {
- Shape getShape(String shapeType);
- }
-
- // 具体创建者类
- class RectangleFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("RECTANGLE")) {
- return new Rectangle();
- }
- return null;
- }
- }
-
- class CircleFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("CIRCLE")) {
- return new Circle();
- }
- return null;
- }
- }
-
- class SquareFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("SQUARE")) {
- return new Square();
- }
- return null;
- }
- }
Τέλος, χρησιμοποιήστε την κλάση συγκεκριμένου δημιουργού για να λάβετε τα αντικείμενα σχήματος και να τα καλέσετεdraw
μέθοδος:
- public class FactoryMethodPatternDemo {
-
- public static void main(String[] args) {
- ShapeFactory shapeFactory = new CircleFactory();
-
- // 获取 Circle 的对象,并调用它的 draw 方法
- Shape shape1 = shapeFactory.getShape("CIRCLE");
- shape1.draw();
-
- // 使用 RectangleFactory 来获取 Rectangle 的对象
- shapeFactory = new RectangleFactory();
- Shape shape2 = shapeFactory.getShape("RECTANGLE");
- shape2.draw();
-
- // 使用 SquareFactory 来获取 Square 的对象
- shapeFactory = new SquareFactory();
- Shape shape3 = shapeFactory.getShape("SQUARE");
- shape3.draw();
- }
- }
Σε αυτό το παράδειγμα,Δημιουργούμε μια αντίστοιχη εργοστασιακή κλάση για κάθε κατηγορία σχήματος (Αν και σε πραγματικές εφαρμογές, θα υπάρχει συνήθως μια γενικότερη δομή εργοστασιακής κλάσης, ίσως μέσω αρχείων διαμόρφωσης ή προβληματισμού για να αποφευχθεί η εγγραφή χωριστών εργοστασιακών κλάσεων για κάθε κατηγορία προϊόντος). Αυτό βοηθά στην επίδειξη των βασικών αρχών του προτύπου Factory Method,Δηλαδή, αφήστε την εργοστασιακή υποκατηγορία να αποφασίσει ποια κλάση θα δημιουργήσει στιγμιότυπο . Ωστόσο, για την απλή περίπτωση σε αυτό το παράδειγμα, μπορεί να είστε πιο διατεθειμένοι να χρησιμοποιήσετε το μοτίβο Simple Factory ή να εξετάσετε άλλα μοτίβα σχεδίασης για να μειώσετε την αντιγραφή κώδικα.
Αυτό το παράδειγμα λαμβάνει ως παράδειγμα κινητά τηλέφωνα, αφηρημένα προϊόντα που σχετίζονται με κινητά τηλέφωνα (όπως οθόνες, μπαταρίες, λειτουργικά συστήματα κ.λπ.) και δημιουργεί συγκεκριμένες κατηγορίες προϊόντων για την υλοποίηση αυτών των διεπαφών. Στη συνέχεια, μπορούμε να ορίσουμε αφηρημένες εργοστασιακές διεπαφές και συγκεκριμένες εργοστασιακές κλάσεις για την παραγωγή αυτών των προϊόντων. Ακολουθεί ένα απλοποιημένο παράδειγμα που δείχνει πώς να χρησιμοποιήσετε το μοτίβο Abstract Factory για την παραγωγή εξαρτημάτων (οθόνες και μπαταρίες) για διαφορετικές μάρκες και μοντέλα κινητών τηλεφώνων:
Αρχικά, ορίστε τη διεπαφή προϊόντος και συγκεκριμένα προϊόντα:
- // 屏幕接口
- interface Screen {
- void display();
- }
-
-
- // 高端屏幕的实现
- class HighEndScreen implements Screen {
- @Override
- public void display() {
- System.out.println("显示高清屏幕");
- }
- }
-
- // 低端屏幕的实现
- class LowEndScreen implements Screen {
- @Override
- public void display() {
- System.out.println("显示普通屏幕");
- }
- }
-
-
- // 电池接口
- interface Battery {
- void charge();
- }
-
-
- // 高效电池的实现
- class HighEfficiencyBattery implements Battery {
- @Override
- public void charge() {
- System.out.println("快速充电");
- }
- }
-
- // 标准电池的实现
- class StandardBattery implements Battery {
- @Override
- public void charge() {
- System.out.println("标准充电");
- }
- }
Στη συνέχεια, ορίστε την αφηρημένη εργοστασιακή διεπαφή και την κλάση εργοστασίου σκυροδέματος:
- // 手机组件工厂接口
- interface PhoneFactory {
- Screen createScreen();
- Battery createBattery();
- }
-
- // 高端手机工厂
- class HighEndPhoneFactory implements PhoneFactory {
- @Override
- public Screen createScreen() {
- return new HighEndScreen();
- }
-
- @Override
- public Battery createBattery() {
- return new HighEfficiencyBattery();
- }
- }
-
- // 低端手机工厂
- class LowEndPhoneFactory implements PhoneFactory {
- @Override
- public Screen createScreen() {
- return new LowEndScreen();
- }
-
- @Override
- public Battery createBattery() {
- return new StandardBattery();
- }
- }
Τέλος, ο κώδικας πελάτη, ο οποίος χρησιμοποιεί ένα αφηρημένο εργοστάσιο για τη δημιουργία συγκεκριμένων αντικειμένων προϊόντος:
- public class PhoneFactoryPatternDemo {
- public static void main(String[] args) {
- // 使用高端手机工厂
- PhoneFactory highEndFactory = new HighEndPhoneFactory();
- Screen highEndScreen = highEndFactory.createScreen();
- Battery highEndBattery = highEndFactory.createBattery();
-
- highEndScreen.display();
- highEndBattery.charge();
-
- // 使用低端手机工厂
- PhoneFactory lowEndFactory = new LowEndPhoneFactory();
- Screen lowEndScreen = lowEndFactory.createScreen();
- Battery lowEndBattery = lowEndFactory.createBattery();
-
- lowEndScreen.display();
- lowEndBattery.charge();
- }
- }
Σε αυτό το παράδειγμα, ορίζουμε δύο εργοστάσια κινητής τηλεφωνίας (high-end και low-end), το καθένα ικανό να παράγει έναν συγκεκριμένο τύπο οθόνης και μπαταρίας.Ο κώδικας πελάτη αλληλεπιδρά με τη συγκεκριμένη εργοστασιακή κατηγορία μέσω της αφηρημένης εργοστασιακής διεπαφής, επιτυγχάνοντας έτσι την αποσύνδεση από τη συγκεκριμένη κατηγορία προϊόντος. . Με αυτόν τον τρόπο, εάν χρειαστεί να προσθέσουμε νέους τύπους τηλεφώνου στο μέλλον (για παράδειγμα, τηλέφωνα μεσαίας κατηγορίας), χρειάζεται μόνο να προσθέσουμε νέες κατηγορίες προϊόντων και αντίστοιχες εργοστασιακές κατηγορίες χωρίς να τροποποιήσουμε τον υπάρχοντα κωδικό πελάτη.
Το εργοστασιακό μοτίβο είναι ένα πολύ χρήσιμο σχέδιο σχεδίασης,Ενσωματώνει τη διαδικασία δημιουργίας αντικειμένων, μειώνει τη σύζευξη, βελτιώνει την επεκτασιμότητα του προγράμματος και την ευκολία συντήρησης κ.λπ. , έχει χρησιμοποιηθεί ευρέως στην ανάπτυξη λογισμικού.Ωστόσο, έχει και μερικάΜειονεκτήματα, όπως υπερβολικές εργοστασιακές ευθύνες, δυσκολία στην επέκταση του συστήματος κ.λπ. . Ως εκ τούτου, στις πρακτικές εφαρμογές, οι ανταλλαγές και οι επιλογές πρέπει να γίνονται με βάση συγκεκριμένα σενάρια και ανάγκες.
Εάν το εργοστασιακό μοτίβο (απλό εργοστάσιο, εργοστασιακή μέθοδος, αφηρημένο εργοστάσιο) σας είναι χρήσιμο, θυμηθείτε να το κάνετε like και να το συλλέξετε.