ברוך הבא לדוגמא של תבנית עיצוב ייצואי ב-Java. תבנית עיצוב ייצורי ייצור הוא אחת מהתבניות היצוריות. תבנית עיצוב זו דומה בכמעט כל דבר לתבנית תבנית יצור עם השוני שהיא דומה יותר למפעל של מפעלים.
תבנית יצור ייצור
אם אתה מכיר תבנית עיצוב של תבנית יצור ב-Java, תגיש לב שיש לנו מפעל יחיד. מחלקת המפעל הזו מחזירה תתי מחלקות שונות בהתבסס על הקלט המסופק ומשתמשת בהצהרת if-else או switch על מנת להשיג זאת. בתבנית העיצוב היבשנית, אנו מיפו על מפעל if-else ויש לנו מפעל לכל תת-מחלקה. לאחר מכן, יש לנו מחלקת מפעל ייבוא שתחזיר את תת-המחלקה בהתבסס על מחלקת המפעל המוזנת. מקורית, זה נראה מבלבל אך לאחר שתראה את היישום, זה מאוד קל להבין ולהבין את השונות הקטנה בין תבנית מפעל ותבנית יצור אבסטרקטית. כמו בפוסט על תבנית המפעל שלנו, נשתמש באותה מערכת מחלקות אב ותתי-מחלקות.
מבנה עיצוב של מפענח המפעילים
Computer.java
package com.journaldev.design.model;
public abstract class Computer {
public abstract String getRAM();
public abstract String getHDD();
public abstract String getCPU();
@Override
public String toString(){
return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU();
}
}
PC.java
package com.journaldev.design.model;
public class PC extends Computer {
private String ram;
private String hdd;
private String cpu;
public PC(String ram, String hdd, String cpu){
this.ram=ram;
this.hdd=hdd;
this.cpu=cpu;
}
@Override
public String getRAM() {
return this.ram;
}
@Override
public String getHDD() {
return this.hdd;
}
@Override
public String getCPU() {
return this.cpu;
}
}
Server.java
package com.journaldev.design.model;
public class Server extends Computer {
private String ram;
private String hdd;
private String cpu;
public Server(String ram, String hdd, String cpu){
this.ram=ram;
this.hdd=hdd;
this.cpu=cpu;
}
@Override
public String getRAM() {
return this.ram;
}
@Override
public String getHDD() {
return this.hdd;
}
@Override
public String getCPU() {
return this.cpu;
}
}
מחלקת יצירה עבור כל כתת-מחלקה
首先,我們需要創建一個抽象工廠接口或抽象類。ComputerAbstractFactory.java
package com.journaldev.design.abstractfactory;
import com.journaldev.design.model.Computer;
public interface ComputerAbstractFactory {
public Computer createComputer();
}
שים לב ששיטת createComputer()
מחזירה מופע של מחלקת העל Computer
. כעת, מחלקות היצירה שלנו יממשו את הממשק ויחזירו את תת-המחלקות הרלוונטיות שלהן. PCFactory.java
package com.journaldev.design.abstractfactory;
import com.journaldev.design.model.Computer;
import com.journaldev.design.model.PC;
public class PCFactory implements ComputerAbstractFactory {
private String ram;
private String hdd;
private String cpu;
public PCFactory(String ram, String hdd, String cpu){
this.ram=ram;
this.hdd=hdd;
this.cpu=cpu;
}
@Override
public Computer createComputer() {
return new PC(ram,hdd,cpu);
}
}
באותה צורה, יש לנו מחלקת יצירה עבור תת-מחלקת Server
. ServerFactory.java
package com.journaldev.design.abstractfactory;
import com.journaldev.design.model.Computer;
import com.journaldev.design.model.Server;
public class ServerFactory implements ComputerAbstractFactory {
private String ram;
private String hdd;
private String cpu;
public ServerFactory(String ram, String hdd, String cpu){
this.ram=ram;
this.hdd=hdd;
this.cpu=cpu;
}
@Override
public Computer createComputer() {
return new Server(ram,hdd,cpu);
}
}
עכשיו ניצור מחלקת צרכן שתספק נקודת כניסה למחלקות הלקוח ליצירת תת-מחלקות. ComputerFactory.java
package com.journaldev.design.abstractfactory;
import com.journaldev.design.model.Computer;
public class ComputerFactory {
public static Computer getComputer(ComputerAbstractFactory factory){
return factory.createComputer();
}
}
הערה כי זו כיתה פשוטה ושיטת getComputer
מקבלת את הארגומנט ComputerAbstractFactory
ומחזירה אובייקט Computer
. בנקודה זו יש להבין את המימוש. בואו נכתוב שיטת בדיקה פשוטה ונראה איך להשתמש בפעולה המופעלת כדי לקבל את המופעים של תתי-המחלקות. TestDesignPatterns.java
package com.journaldev.design.test;
import com.journaldev.design.abstractfactory.PCFactory;
import com.journaldev.design.abstractfactory.ServerFactory;
import com.journaldev.design.factory.ComputerFactory;
import com.journaldev.design.model.Computer;
public class TestDesignPatterns {
public static void main(String[] args) {
testAbstractFactory();
}
private static void testAbstractFactory() {
Computer pc = com.journaldev.design.abstractfactory.ComputerFactory.getComputer(new PCFactory("2 GB","500 GB","2.4 GHz"));
Computer server = com.journaldev.design.abstractfactory.ComputerFactory.getComputer(new ServerFactory("16 GB","1 TB","2.9 GHz"));
System.out.println("AbstractFactory PC Config::"+pc);
System.out.println("AbstractFactory Server Config::"+server);
}
}
הפלט של התוכנית הנלמדת יהיה:
AbstractFactory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz
AbstractFactory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz
כאן נמצא תרשים המחלקה של המימוש של תבנית המבנה המפעיל.
היתרונות של תבנית המבנה המפעיל
- תבנית המבנה המפעיל מספקת גישה לקוד עבור ממשק במקום עבור המימוש.
- תבנית המבנה המפעיל היא "מפעל של מפעלים" וניתן להרחיב אותה בקלות כדי לכלול מוצרים נוספים, לדוגמה ניתן להוסיף תת-מחלקה של לפטופ ומפעל לפטופ.
- תבנית המבנה המפעיל היא יציבה ומתרחקת מלוגיקת תנאי בתבנית המפעיל.
דוגמאות לתבנית עיצוב מפענח המתבצעות ב-JDK
- javax.xml.parsers.DocumentBuilderFactory#newInstance()
- javax.xml.transform.TransformerFactory#newInstance()
- javax.xml.xpath.XPathFactory#newInstance()
שיעור וידאו של תבנית עיצוב מפענח המתבצעת
I recently uploaded a video on YouTube for abstract factory design pattern. In the video, I discuss when and how to implement an abstract factory pattern. I have also discussed what is the difference between the factory pattern and abstract factory design pattern. https://youtu.be/BPkYkyVWOaw
ניתן להוריד את קוד הדוגמאות מפרויקט ה-GitHub שלי.
Source:
https://www.digitalocean.com/community/tutorials/abstract-factory-design-pattern-in-java