Kas yra gamyklos dizaino modelis?

Kas yra gamyklos dizaino modelis?
Tokie skaitytojai kaip jūs padeda palaikyti MUO. Kai perkate naudodami nuorodas mūsų svetainėje, galime uždirbti filialų komisinius. Skaityti daugiau.

Gamyklos (arba gamyklos metodo) dizaino modelis specializuojasi delegavimo ir inkapsuliavimo srityje. Šis modelis leidžia superklasei atidėti poklasių egzistavimą. Taip yra todėl, kad klasė, kurioje yra pirminis gamyklos metodo modelis, yra abstrakti.





Pradinė gamyklinio metodo versija įgauna neįgyvendinto metodo formą, nes nežino produkto, kurį sukurs. Gamyklos metodas gali žinoti, kad jis kuria kokį nors produktą, bet nežino konkrečių gaminio, kurį jis sukurs, savybių. Šios žinios prieinamos tik atitinkamiems poklasiams. Todėl atsakomybė už gamyklos metodo įgyvendinimą ir tinkamų objektų kūrimą tenka tik poklasiui.





„Java“ gamyklinio dizaino modelio įgyvendinimas

Šiame straipsnyje naudojama atsiliepimų ataskaitų generavimo programos pavyzdys. Ši programa naudoja įvairių tipų atsiliepimus, kuriuos įmonė gauna (naujo užkandžio atveju), kad sukurtų konkrečias ataskaitas (naudojant gamyklos metodą). Todėl gamyklos modelis sukurs konkretų atsiliepimą (arba atsiliepimų ataskaitą), kaip pagrindą naudodamas šią pirminę produktų klasę:





 public abstract class Feedback { 
    
   private String reviewerName;
   private String reviewMessage;
   private int reviewRatings;
    
   public Feedback(String reviewerName, String reviewMessage, int reviewRatings) {
        this.reviewerName = reviewerName;
        this.reviewMessage = reviewMessage;
        this.reviewRatings = reviewRatings;
  }
    
  public String getReviewerName() {
      return reviewerName;
  }
  public void setReviewerName(String reviewerName) {
      this.reviewerName = reviewerName;
  }
  public String getReviewMessage() {
      return reviewMessage;
  }
  public void setReviewMessage(String reviewMessage) {
      this.reviewMessage = reviewMessage;
  }
  public int getReviewRatings() {
      return reviewRatings;
  }
  public void setReviewRatings(int reviewRatings) {
      this.reviewRatings = reviewRatings;
  }
}

Kiekvienas atsiliepimas turės tris privalomas ypatybes, apžvalgininko vardą, apžvalgos pranešimą ir įvertinimą (nuo vieno iki penkių) naujam užkandžiui. Įvairių tipų atsiliepimai, kuriuos įmonė gaus, bus pateikti vienu iš trijų kanalų:

Atsiliepimų klasė el. paštu



 public class EmailFeedback extends Feedback { 
    
  private String reviewerEmail;

  public EmailFeedback(String reviewerName, String reviewMessage, int reviewRatings, String reviewerEmail) {
     super(reviewerName, reviewMessage, reviewRatings);
     this.reviewerEmail = reviewerEmail;
  }
  public String getReviewerEmail() {
     return reviewerEmail;
  }
  public void setReviewerEmail(String reviewerEmail) {
     this.reviewerEmail = reviewerEmail;
  }
}

Pašto atsiliepimų klasė

 public class MailFeedback extends Feedback { 
    
   private String returnAddress;
    
   public MailFeedback(String reviewerName, String reviewMessage, int reviewRatings, String returnAddress) {
        super(reviewerName, reviewMessage, reviewRatings);
        this.returnAddress = returnAddress;
     }

   public String getReturnAddress() {
       return returnAddress;
     }

   public void setReturnAddress(String returnAddress) {
       this.returnAddress = returnAddress;
     }
}

Socialinės žiniasklaidos atsiliepimų klasė





 public class SocialMediaFeedback extends Feedback { 

   private String reviewerHandle;

   public SocialMediaFeedback(String reviewerName, String reviewMessage, int reviewRatings, String reviewerHandle) {
        super(reviewerName, reviewMessage, reviewRatings);
        this.reviewerHandle = reviewerHandle;
     }
    
   public String getReviewerHandle() {
       return reviewerHandle;
     }

   public void setReviewerHandle(String reviewerHandle) {
       this.reviewerHandle = reviewerHandle;
     }
}

Pastebėsite, kad kiekvienas grįžtamojo ryšio poklasis turi unikalią savybę. Tai reiškia, kad turėsite sukurti kiekvieno atsiliepimo tipo ataskaitą naudodami bent vieną ypatybę, kuri yra unikali tam tipui.

Paprastoji gamykla

Paprasta gamykla yra populiarus būdas naudoti gamyklos dizaino modelį. Šis metodas apima visų skirtingų atsiliepimų (arba produktų) grupavimą pagal metodą (paprastą gamyklą) ir atitinkamo grįžtamojo ryšio parinkimą pagal parametrą.





 public class FeedbackReportFactory { 
    
    public Feedback makeFeedback(String feedbackType) {
         Feedback feedback = null;
          
         if(feedbackType.equals("email")) {
               feedback = new EmailFeedback();
         }else if (feedbackType.equals("mail")) {
               feedback = new MailFeedback();
         }else if (feedbackType.equals("social")) {
               feedback = new SocialMediaFeedback();
         }
     return feedback;
     }
}

Tačiau paprastas gamyklos metodas nėra nei gamyklos dizaino modelis, nei dizaino modelis. Tai daugiau kaip dizaino koncepcija.

Gamyklos metodas

Gamyklos metodas yra tikrasis dizaino modelio vaizdas. Taikant gamyklinį metodą, reformuotas AtsiliepimaiReportFactory Java klasė dabar bus toks kodas:

 public abstract class FeedbackReportFactory { 
    public abstract void makeFeedbackReport(Feedback feedback);
}

Gamyklos dizaino modelio struktūrą galite apibrėžti naudodami šią klasių diagramą:

  Gamyklos metodo klasių diagrama

Iš aukščiau pateiktos diagramos pamatysite, kad abstrakčioje klasėje (arba sąsajoje) bus abstrakčioji gamyklinio metodo versija. Taigi, betono gamyklos klasės, išplečiančios abstrakčiąją klasę, įgyvendins gamyklos metodą, naudodamos savybes, kurios yra unikalios gaminiui, kurį norima sukurti. Taip pat turėtumėte atkreipti dėmesį, kad bet kuri betono gamyklos klasė turėtų sukurti vieną ar daugiau gaminių.

Programos pavyzdyje yra trys susiję, bet unikalūs produktai. Kiekvienas grįžtamojo ryšio tipas turi bent vieną unikalią savybę. Taigi kiekvienam produktui sukurti reikės trijų betono gamyklų.

Atsiliepimų gamykla el. paštu

 public class EmailFeedbackReport extends FeedbackReportFactory{ 
    
    EmailFeedback feedback;

    @Override
    public void makeFeedbackReport(Feedback feedback) {
          
        this.feedback = (EmailFeedback) feedback;
          
        System.out.println("\nReport For Feedback Via Email" +
                  "\nReviewer Name: " +this.feedback.getReviewerName() +
                  "\nFeedback: " + this.feedback.getReviewMessage() +
                  "\nRatings: " + this.feedback.getReviewRatings() +
                  "\nEmal Address: " + this.feedback.getReviewerEmail());
     }
}

Pašto atsiliepimų gamykla

kaip ištrinti susietą paskyrą
 public class MailFeedbackReport extends FeedbackReportFactory { 
    MailFeedback feedback;

    @Override
    public void makeFeedbackReport(Feedback feedback) {
         this.feedback = (MailFeedback) feedback;
          
         System.out.println("\nReport For Feedback Via Mail" +
                     "\nReviewer Name: " +this.feedback.getReviewerName() +
                     "\nFeedback: " + this.feedback.getReviewMessage() +
                     "\nRatings: " + this.feedback.getReviewRatings() +
                     "\nMailing Address: " + this.feedback.getReturnAddress());
     }
}

Socialinių tinklų atsiliepimų fabrikas

 public class SocialMediaFeedbackReport extends FeedbackReportFactory { 
    SocialMediaFeedback feedback;

    @Override
    public void makeFeedbackReport(Feedback feedback) {
        this.feedback = (SocialMediaFeedback) feedback;
                
        System.out.println("\nReport For Feedback Via Social Media" +
                      "\nReviewer Name: " + this.feedback.getReviewerName() +
                      "\nFeedback: " + this.feedback.getReviewMessage() +
                      "\nRatings: " + this.feedback.getReviewRatings() +
                      "\nReviewer Social Media Handle: " + this.feedback.getReviewerHandle());
           }
}

Programos pavyzdžio testavimas

Dabar galite naudoti atitinkamus gamyklinius metodus, kad sudarytumėte miniatiūrines ataskaitas apie atsiliepimus, gautus iš skirtingų kanalų. Tu gali išbandykite programą naudodami JUnit , arba galite sukurti vairuotojo klasę:

 public class Main { 

   public static void main(String[] args) {
       Feedback feedback = new EmailFeedback("Nick", "Great product!", 5, "nick@email.com");
       Feedback feedback2 = new MailFeedback("john", "The product is good but not something I would buy regularly", 4, "first Street");
       Feedback feedback3 = new SocialMediaFeedback("Jane", "It's not for me", 2, "@janey");
          
       FeedbackReportFactory factory = new EmailFeedbackReport();
       FeedbackReportFactory factory2 = new MailFeedbackReport();
       FeedbackReportFactory factory3 = new SocialMediaFeedbackReport();
          
       factory.makeFeedbackReport(feedback);
       factory2.makeFeedbackReport(feedback2);
       factory3.makeFeedbackReport(feedback3);
   }

Aukščiau pateikta pagrindinė klasė naudoja atitinkamas gamyklas, kad sukurtų tris ataskaitas, kurios konsolėje pateikia tokią išvestį:

  Gamyklos metodo konsolės išvestis

Gamyklos dizaino modelio naudojimo pranašumai

Gamyklos dizaino modelis skatina dizaino lankstumą, kai naudojate sąsajas (arba abstrakčias klases), kad sukurtumėte konkrečias klases. Tai taip pat skatina mastelio keitimą per polimorfizmą, leisdama naujoms klasėms įdiegti esamą sąsają, kai programa plečiasi.

Kai naudojate gamyklinį projektavimo modelį, naudojate du svarbius projektavimo principus: atvirą-uždarymą ir valdymo inversiją (IoC).