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.
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 (yeni bir atıştırmalık için) aldığı 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:
halksoyutsınıfGeri bildirim{
özel Sicim gözden geçirenAdı;
özel Sicim mesajı gözden geçirin;
özelint değerlendirmeler;
halkGeri bildirim(Dize gözden geçirenin adı, Dize gözden geçirenMesaj, int gözden geçirmePuanlar){
Bu.reviewerName = gözden geçirenAdı;
Bu.reviewMessage = incelemeMessage;
Bu.reviewRatings = incelemeRatings;
}
halk Sicim GetReviewerName(){
geri dönmek gözden geçirenAdı;
}
halkgeçersizsetReviewerName(Dize gözden geçirenin adı){
Bu.reviewerName = gözden geçirenAdı;
}
halk Sicim getReviewMessage(){
geri dönmek mesajı gözden geçirin;
}
halkgeçersizsetReviewMessage(Dize incelemesiMesaj){
Bu.reviewMessage = incelemeMessage;
}
halkintgetReviewRatings(){
geri dönmek değerlendirmeler;
}
halkgeçersizsetReviewRatings(int gözden geçirmePuanlar){
Bu.reviewRatings = incelemeRatings;
}
}
Her geri bildirimde üç zorunlu özellik, bir gözden geçiren adı, bir inceleme mesajı ve yeni atıştırmalık 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ı
halksınıfE-posta GeribildirimuzanırGeri bildirim{
özel Sicim yorumcu E-postası;
herkese açık E-postaGeri Bildirim(Sicim gözden geçirenAdı, Sicim incelemeMesaj, int incelemeDeğerlendirmeler, Sicim yorumcuE-postası) {
Süper(reviewerName, incelemeMessage, incelemeRatings);
Bu.reviewerEmail = yorumcuEmaili;
}
halk Sicim getReviewerE-postası(){
geri dönmek yorumcu E-postası;
}
halkgeçersizsetReviewerEmail(Dize inceleyici E-postası){
Bu.reviewerEmail = yorumcuEmaili;
}
}
Posta Geri Bildirim Sınıfı
halksınıfPosta GeribildirimiuzanırGeri bildirim{
özel Sicim iade adresi;
genel MailFeedback(Sicim gözden geçirenAdı, Sicim incelemeMesaj, int incelemeDeğerlendirmeler, Sicim iade adresi) {
Süper(reviewerName, incelemeMessage, incelemeRatings);
Bu.returnAddress = iadeAdresi;
}halk Sicim GetReturnAddress(){
geri dönmek iade adresi;
}
halkgeçersizsetReturnAddress(Dize dönüşAdresi){
Bu.returnAddress = iadeAdresi;
}
}
Sosyal Medya Geri Bildirim Sınıfı
halksınıfSosyal Medya Geri BildirimiuzanırGeri bildirim{
özel Sicim yorumcuTutucu;
herkese açık SocialMediaFeedback(Sicim gözden geçirenAdı, Sicim incelemeMesaj, int incelemeDeğerlendirmeler, Sicim yorumcuİşlemi) {
Süper(reviewerName, incelemeMessage, incelemeRatings);
Bu.reviewerHandle = gözden geçirenHandle;
}
halk Sicim getReviewerHandle(){
geri dönmek yorumcuTutucu;
}
halkgeçersizsetReviewerHandle(Dize inceleyiciİşlemi){
Bu.reviewerHandle = gözden geçirenHandle;
}
}
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.
halksınıfGeribildirimRaporFabrika{
halk Geri bildirim geri bildirim yap(Dize geribildirimTürü){
Geribildirim geribildirimi = hükümsüz;
eğer(feedbackType.eşittir("e-posta")) {
geribildirim = yeni EmailFeedback();
}başkaeğer (feedbackType.eşittir("posta")) {
geribildirim = yeni MailFeedback();
}başkaeğer (feedbackType.eşittir("sosyal")) {
geribildirim = yeni SocialMediaFeedback();
}
geri dönmek geri bildirim;
}
}
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ş GeribildirimRaporFabrikaJava sınıfı şimdi aşağıdaki kodu içerecektir:
halksoyutsınıfGeribildirimRaporFabrika{
halksoyutgeçersizgeri bildirim raporu yap(Geri bildirim geribildirimi);
}
Fabrika tasarım deseninin yapısını aşağıdaki sınıf diyagramı ile tanımlayabilirsiniz:
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ı
halksınıfE-postaGeri BildirimRaporuuzanırGeribildirimRaporFabrika{
E-posta Geribildirim geri bildirimi;
@geçersiz kıl
halkgeçersizgeri bildirim raporu yap(Geri bildirim geribildirimi){
Bu.feedback = (EmailFeedback) geribildirim;
sistem.dışarı.println("\nRaporİçinGeri bildirimAracılığıylaE-posta" +
"\nİnceleyen Adı: " +Bu.feedback.getReviewerName() +
"\nGeri bildirim: " + Bu.feedback.getReviewMessage() +
"\nDerecelendirmeler: " + Bu.feedback.getReviewRatings() +
"\nEmal Adresi: " + Bu.feedback.getReviewerEmail());
}
}
Posta Geri Bildirim Fabrikası
halksınıfMailFeedbackRaporuuzanırGeribildirimRaporFabrika{
MailFeedback geri bildirimi;
@geçersiz kıl
halkgeçersizgeri bildirim raporu yap(Geri bildirim geribildirimi){
Bu.feedback = (MailFeedback) geribildirimi;
sistem.dışarı.println("\nRaporİçinGeri bildirimAracılığıylaPosta" +
"\nİnceleyen Adı: " +Bu.feedback.getReviewerName() +
"\nGeri bildirim: " + Bu.feedback.getReviewMessage() +
"\nDerecelendirmeler: " + Bu.feedback.getReviewRatings() +
"\nPosta Adresi: " + Bu.feedback.getReturnAddress());
}
}
Sosyal Medya Geri Bildirim Fabrikası
halksınıfSosyal MedyaGeri Bildirim RaporuuzanırGeribildirimRaporFabrika{
Sosyal Medya Geribildirim geri bildirimi;
@geçersiz kıl
halkgeçersizgeri bildirim raporu yap(Geri bildirim geribildirimi){
Bu.feedback = (SocialMediaFeedback) geri bildirimi;
sistem.dışarı.println("\nRaporİçinGeri bildirimAracılığıylaSosyalmedya" +
"\nİnceleyen Adı: " + Bu.feedback.getReviewerName() +
"\nGeri bildirim: " + Bu.feedback.getReviewMessage() +
"\nDerecelendirmeler: " + Bu.feedback.getReviewRatings() +
"\nİnceleyen Sosyal Medya İşlemcisi: " + Bu.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 edinveya bir sürücü sınıfı oluşturabilirsiniz:
halksınıfAna{
halkstatikgeçersizana(Dize[] bağımsız değişkenler){
Geribildirim geribildirimi = yeni E-posta Geribildirim("Nick", "Harika ürün!", 5, "[email protected]");
Geribildirim geri bildirim2 = yeni Posta Geribildirimi("John", "Ürün iyi ama düzenli olarak alacağım bir şey değil", 4, "ilk sokak");
Geribildirim geri bildirim3 = yeni Sosyal Medya Geribildirimi("Jane", "Benim için değil", 2, "@janey");
GeribildirimRaporFabrika fabrikası = yeni EmailFeedbackReport();
GeribildirimRaporFabrika fabrikası2 = yeni MailFeedbackReport();
GeribildirimRaporFabrika fabrikası3 = yeni SocialMediaFeedbackReport();
fabrika.makeFeedbackRaporu(geri bildirim);
fabrika2.makeFeedbackRaporu(geri bildirim2);
fabrika3.makeFeedbackRaporu(geri bildirim3);
}
Yukarıdaki Ana sınıf, konsolda aşağıdaki çıktıyı üreten üç rapor oluşturmak için ilgili fabrikaları kullanır:
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).