Fabrika Tasarım Modeli Nedir?

Fabrika Tasarım Modeli Nedir?
Sizin gibi okuyucular MUO'yu desteklemeye yardımcı oluyor. Sitemizdeki bağlantıları kullanarak bir satın alma işlemi gerçekleştirdiğinizde, bir ortaklık komisyonu kazanabiliriz. Daha fazla oku.

Fabrika (veya fabrika yöntemi) tasarım modeli, delegasyon ve kapsülleme konusunda uzmanlaşmıştır. Bu kalıp, bir üst sınıfın örneklemeyi alt sınıflara ertelemesine izin verir. Bunun nedeni, birincil fabrika yöntemi modelini içeren sınıfın soyut olmasıdır.





sabit sürücünüzün arızalanıp arızalanmadığını nasıl test edersiniz

Fabrika yönteminin orijinal hali üreteceği ürünü bilmediği için uygulanmamış bir yöntem şeklini alır. Fabrika yöntemi, bir ürün yarattığını biliyor olabilir, ancak yaratacağı ürünün kendine özgü özelliklerini bilmiyor. Bu bilgi yalnızca ilgili alt sınıflar tarafından kullanılabilir. Bu nedenle, fabrika yöntemini uygulama ve uygun nesneleri yaratma sorumluluğu yalnızca bir alt sınıfın sorumluluğundadır.





Fabrika Tasarım Modelini Java'da Uygulamak

Bu makalede, örnek bir geri bildirim raporu oluşturma uygulaması kullanılmaktadır. Bu uygulama, belirli raporlar oluşturmak için (fabrika yöntemini kullanarak) bir şirketin aldığı (yeni bir atıştırmalık için) farklı geri bildirim türlerini kullanır. Bu nedenle fabrika modeli, aşağıdaki birincil ürün sınıfını temel alarak belirli bir geri bildirim (veya geri bildirim raporu) oluşturacaktır:





 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;
  }
}

Her geri bildirimin üç zorunlu özelliği, bir gözden geçirenin adı, bir inceleme mesajı ve yeni atıştırma için bir sayı derecelendirmesi (birden beşe kadar) olacaktır. Şirketin alacağı farklı geri bildirim türleri üç kanaldan birinden gelecektir:

E-posta Geri Bildirim Sınıfı



 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;
  }
}

Posta Geri Bildirim Sınıfı

 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;
     }
}

Sosyal Medya Geri Bildirim Sınıfı





 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;
     }
}

Her geri bildirim alt sınıfının benzersiz bir özelliği olduğunu fark edeceksiniz. Bu, o türe özgü en az bir özelliği kullanarak her geri bildirim türü için rapor oluşturmanız gerekeceği anlamına gelir.

Basit Fabrika

Basit bir fabrika, fabrika tasarım modelini kullanmaya yönelik popüler bir yaklaşımdır. Bu yaklaşım, tüm farklı geri bildirimleri (veya ürünleri) bir yöntemde (basit fabrika) gruplandırmayı ve bir parametreye dayalı olarak uygun geri bildirimi seçmeyi gerektirir.





 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;
     }
}

Bununla birlikte, basit fabrika yaklaşımı, fabrika tasarım modeli olmadığı gibi, bir tasarım modeli de değildir. Daha çok bir tasarım konsepti gibi.

Fabrika Yöntemi

Fabrika yöntemi, tasarım modelinin gerçek temsilidir. Fabrika yöntemini kullanarak, reforme edilmiş GeribildirimRaporFabrika Java sınıfı şimdi aşağıdaki kodu içerecektir:

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

Fabrika tasarım deseninin yapısını aşağıdaki sınıf diyagramı ile tanımlayabilirsiniz:

  Fabrika yöntemi sınıf diyagramı

Yukarıdaki diyagramdan, soyut bir sınıfın (veya arabirimin) fabrika yönteminin soyut bir sürümünü içereceğini göreceksiniz. Böylece, soyut sınıfı genişleten somut fabrika sınıfları, oluşturmak istediği ürüne özgü özellikleri kullanarak fabrika yöntemini uygulayacaktır. Ayrıca, herhangi bir beton fabrikası sınıfının bir veya daha fazla ürün oluşturması gerektiğini de unutmamalısınız.

Örnek uygulamanın birbiriyle ilişkili ancak benzersiz üç ürünü vardır. Her geri bildirim türünün en az bir benzersiz özelliği vardır. Bu nedenle, uygulamanın her ürünü oluşturmak için üç beton fabrikasına sahip olması gerekecektir.

E-posta Geri Bildirim Fabrikası

 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());
     }
}

Posta Geri Bildirim Fabrikası

 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());
     }
}

Sosyal Medya Geri Bildirim 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());
           }
}

Örnek Uygulamayı Test Etme

Artık farklı kanallardan alınan geri bildirimler hakkında minyatür raporlar oluşturmak için ilgili fabrika yöntemlerini kullanabilirsiniz. Yapabilirsiniz JUnit kullanarak uygulamayı test edin veya bir sürücü sınıfı oluşturabilirsiniz:

 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);
   }

Yukarıdaki Ana sınıf, konsolda aşağıdaki çıktıyı üreten üç rapor oluşturmak için ilgili fabrikaları kullanır:

  Fabrika yöntemi konsol çıktısı

Fabrika Tasarım Modelini Kullanmanın Avantajları

Fabrika tasarım deseni, somut sınıflar oluşturmak için arabirimleri (veya soyut sınıfları) kullandığınız tasarım esnekliğini destekler. Ayrıca, uygulama genişledikçe yeni sınıfların mevcut arabirimi uygulamasına izin vererek, polimorfizm yoluyla ölçeklenebilirliği destekler.

Fabrika tasarım modelini kullandığınızda, iki önemli tasarım ilkesinden yararlanıyorsunuz: Açık-kapalı ve Kontrolün Ters Çevirilmesi (IoC).