Cititorii ca tine ajută la sprijinirea MUO. Când efectuați o achiziție folosind link-uri de pe site-ul nostru, este posibil să câștigăm un comision de afiliat. Citeşte mai mult.

Modelul de proiectare din fabrică (sau metoda fabricii) este specializat în delegare și încapsulare. Acest model permite unei superclase să amâne instanțierea la subclase. Acest lucru se datorează faptului că clasa care conține modelul principal de metodă din fabrică este abstractă.

Versiunea originală a metodei din fabrică ia forma unei metode neimplementate deoarece nu cunoaște produsul pe care îl va crea. Metoda din fabrică poate ști că creează un produs, dar nu cunoaște caracteristicile specifice ale produsului pe care îl va crea. Aceste cunoștințe sunt disponibile numai subclaselor respective. Prin urmare, responsabilitatea de a implementa metoda fabrică și de a crea obiecte adecvate este exclusiv cea a unei subclase.

Implementarea modelului de proiectare a fabricii în Java

Acest articol utilizează un exemplu de aplicație de generare a rapoartelor de feedback. Această aplicație folosește diferitele tipuri de feedback pe care le primește o companie (pentru o nouă gustare) pentru a crea rapoarte specifice (folosind metoda din fabrică). Prin urmare, modelul din fabrică va crea un feedback specific (sau un raport de feedback), folosind următoarea clasă de produs principală ca bază:

instagram viewer

publicabstractclasăPărere{

privat Şir reviewerName;
privat Şir reviewMessage;
privatint recenzieEvaluări;

publicPărere(Nume examinator de șiruri, Mesaj de revizuire șiruri, int recenzieEvaluări){
acest.reviewerName = reviewerName;
acest.reviewMessage = reviewMessage;
acest.reviewRatings = reviewEvaluări;
}

public Şir getReviewerName(){
întoarcere reviewerName;
}
publicgolsetReviewerName(Nume examinator de șiruri){
acest.reviewerName = reviewerName;
}
public Şir getReviewMessage(){
întoarcere reviewMessage;
}
publicgolsetReviewMessage(Revizuire șiruriMesaj){
acest.reviewMessage = reviewMessage;
}
publicintgetReviewRatings(){
întoarcere recenzieEvaluări;
}
publicgolsetReviewRatings(int recenzieEvaluări){
acest.reviewRatings = reviewEvaluări;
}
}

Fiecare feedback va avea trei proprietăți obligatorii, un nume de recenzent, un mesaj de recenzie și o evaluare numerică (de la unu la cinci) pentru noua gustare. Diferitele tipuri de feedback pe care le va primi compania vor veni de la unul dintre cele trei canale:

Clasă de feedback prin e-mail

publicclasăFeedback prin e-mailse extindePărere{

privat Şir recenzentE-mail;

E-mail public Feedback(Şir reviewerName, Şir reviewMessage, int reviewEvaluări, Şir e-mail al recenzentului) {
super(nume recenzor, mesajul recenziei, evaluarea recenziei);
acest.reviewerEmail = recenzorEmail;
}
public Şir getReviewerEmail(){
întoarcere recenzentE-mail;
}
publicgolsetReviewerEmail(E-mail pentru examinator de șiruri){
acest.reviewerEmail = recenzorEmail;
}
}

Clasă de feedback prin e-mail

publicclasăFeedback prin e-mailse extindePărere{

privat Şir returnAddress;

Public MailFeedback(Şir reviewerName, Şir reviewMessage, int reviewEvaluări, Şir returnAddress) {
super(nume recenzor, mesajul recenziei, evaluarea recenziei);
acest.returnAddress = returnAddress;
}

public Şir getReturnAddress(){
întoarcere returnAddress;
}

publicgolsetReturnAddress(Șir returnAddress){
acest.returnAddress = returnAddress;
}
}

Clasă de feedback pe rețelele sociale

publicclasăSocialMediaFeedbackse extindePărere{

privat Şir ReviewerHandle;

Feedback public SocialMedia(Şir reviewerName, Şir reviewMessage, int reviewEvaluări, Şir ReviewerHandle) {
super(nume recenzor, mesajul recenziei, evaluarea recenziei);
acest.reviewerHandle = recenzorHandle;
}

public Şir getReviewerHandle(){
întoarcere ReviewerHandle;
}

publicgolsetReviewerHandle(Manerul pentru examinarea șirurilor){
acest.reviewerHandle = recenzorHandle;
}
}

Veți observa că fiecare subclasă de feedback are o proprietate unică. Aceasta înseamnă că va trebui să creați raportul pentru fiecare tip de feedback folosind cel puțin o proprietate unică pentru acel tip.

Fabrica Simplă

O fabrică simplă este o abordare populară pentru utilizarea modelului de proiectare a fabricii. Această abordare presupune gruparea tuturor feedback-urilor (sau produselor) diferite într-o metodă (fabrica simplă) și selectarea feedback-ului adecvat pe baza unui parametru.

publicclasăFeedbackReportFactory{

public Părere faceFeedback(Tip feedback șir){
Feedback feedback = nul;

dacă(feedbackType.equals("e-mail")) {
feedback = nou EmailFeedback();
}altfeldacă (feedbackType.equals("Poștă")) {
feedback = nou MailFeedback();
}altfeldacă (feedbackType.equals("social")) {
feedback = nou SocialMediaFeedback();
}
întoarcere părere;
}
}

Cu toate acestea, abordarea simplă a fabricii nu este modelul de proiectare din fabrică și nici nu este un model de design. Este mai mult ca un concept de design.

Metoda fabricii

Metoda din fabrică este reprezentarea adevărată a modelului de proiectare. Folosind metoda fabricii, reformat FeedbackReportFactoryClasa Java va conține acum următorul cod:

publicabstractclasăFeedbackReportFactory{
publicabstractgolfaceFeedbackRaport(Feedback feedback);
}

Puteți defini structura modelului de proiectare din fabrică cu următoarea diagramă de clasă:

Din diagrama de mai sus veți vedea că o clasă abstractă (sau interfață) va conține o versiune abstractă a metodei din fabrică. Deci, clasele de fabrică concrete care extind clasa abstractă vor implementa metoda fabrică, folosind proprietăți unice pentru produsul pe care dorește să-l creeze. De asemenea, trebuie să rețineți că orice clasă de fabrică de beton ar trebui să creeze unul sau mai multe produse.

Aplicația eșantion are trei produse legate, dar unice. Fiecare tip de feedback are cel puțin o proprietate unică. Deci, aplicația va trebui să aibă trei fabrici de beton pentru a construi fiecare produs.

Fabrica de feedback prin e-mail

publicclasăE-mailFeedbackRaportse extindeFeedbackReportFactory{

Feedback prin e-mail;

@Trece peste
publicgolfaceFeedbackRaport(Feedback feedback){

acest.feedback = feedback (EmailFeedback);

Sistem.out.println("\nRaportPentruPărerePrin intermediulE-mail" +
„\nNumele examinatorului: „ +acest.feedback.getReviewerName() +
"\nFeedback: " + acest.feedback.getReviewMessage() +
"\nEvaluări: " + acest.feedback.getReviewRatings() +
"\nAdresa emal: " + acest.feedback.getReviewerEmail());
}
}

Fabrica de feedback prin e-mail

publicclasăMailFeedbackRaportse extindeFeedbackReportFactory{
Feedback MailFeedback;

@Trece peste
publicgolfaceFeedbackRaport(Feedback feedback){
acest.feedback = feedback (MailFeedback);

Sistem.out.println("\nRaportPentruPărerePrin intermediulPoștă" +
„\nNumele examinatorului: „ +acest.feedback.getReviewerName() +
"\nFeedback: " + acest.feedback.getReviewMessage() +
"\nEvaluări: " + acest.feedback.getReviewRatings() +
"\nAdresa poștală: " + acest.feedback.getReturnAddress());
}
}

Fabrica de feedback pe rețelele sociale

publicclasăSocial MediaFeedbackRaportse extindeFeedbackReportFactory{
Feedback SocialMedia;

@Trece peste
publicgolfaceFeedbackRaport(Feedback feedback){
acest.feedback = feedback (SocialMediaFeedback);

Sistem.out.println("\nRaportPentruPărerePrin intermediulSocialMass-media" +
„\nNumele examinatorului: „ + acest.feedback.getReviewerName() +
"\nFeedback: " + acest.feedback.getReviewMessage() +
"\nEvaluări: " + acest.feedback.getReviewRatings() +
„\nManagerul pentru rețelele sociale pentru examinator: „ + acest.feedback.getReviewerHandle());
}
}

Testarea aplicației eșantion

Acum puteți folosi metodele din fabrică respective pentru a realiza rapoarte în miniatură cu privire la feedback-ul primit de la diferitele canale. Puteți testați aplicația folosind JUnit, sau puteți crea o clasă de șoferi:

publicclasăPrincipal{

publicstaticgolprincipal(Șir[] argumente){
Feedback feedback = nou Feedback prin e-mail("Nick", "Produs grozav!", 5, [email protected]);
Feedback feedback2 = nou MailFeedback("Ioan", „Produsul este bun, dar nu este ceva ce aș cumpăra în mod regulat”, 4, "prima strada");
Feedback feedback3 = nou Feedback pe social media("Jane", "Nu este pentru mine", 2, „@janey”);

FeedbackReportFactory fabrică = nou EmailFeedbackReport();
FeedbackReportFactory factory2 = nou MailFeedbackReport();
FeedbackReportFactory fabrică3 = nou SocialMediaFeedbackReport();

fabrică.makeFeedbackRaport(părere);
fabrica2.makeFeedbackRaport(feedback2);
fabrica3.makeFeedbackRaport(feedback3);
}

Clasa principală de mai sus utilizează fabricile respective pentru a crea trei rapoarte, producând următoarea ieșire în consolă:

Avantajele utilizării modelului de design din fabrică

Modelul de proiectare din fabrică promovează flexibilitatea designului, în cazul în care utilizați interfețe (sau clase abstracte) pentru a crea clase concrete. De asemenea, promovează scalabilitatea prin polimorfism, permițând noilor clase să implementeze interfața existentă pe măsură ce aplicația se extinde.

Când utilizați modelul de proiectare din fabrică, utilizați două principii importante de proiectare: deschis-închis și inversarea controlului (IoC).