Java: Fabrika Tasarımı-Yöntem Modeli | Nesneye Yönelik Tasarım | Tasarım desenleri
Yayınlanan: 2013-06-28 Factory Design Pattern, Creational Design modellerinden biridir ve JDK'da ve Spring MVC ve Struts gibi çerçevelerde yaygın olarak kullanılır. Fabrika yöntemi kalıbı , fabrika kavramını uygulamak için nesne yönelimli bir yaratıcı tasarım kalıbıdır ve oluşturulacak nesnenin tam sınıfını belirtmeden nesneler (ürünler) oluşturma sorunuyla ilgilenir. Bu kalıbın özü şudur: “ Bir nesne oluşturmak için bir arayüz tanımlayın, ancak arayüzü uygulayan sınıfların hangi sınıfın başlatılacağına karar vermesine izin verin. Factory yöntemi, bir sınıfın somutlaştırmayı ".alt sınıflara ertelemesine " izin verir.
Önce Java'da fabrika deseninin nasıl uygulanacağını öğrenelim. Bu kalıbı uygulamak için 5 sınıf oluşturacağız.
- Süper Sınıf (CrunchfiyCompany.java)
- Fabrika modelindeki süper sınıf, bir arayüz, soyut sınıf veya normal bir Java sınıfı olabilir. Örneğimiz için, test amacıyla geçersiz
toString()
yöntemiyle soyut sınıf olarak süper sınıfımız var.
- Fabrika modelindeki süper sınıf, bir arayüz, soyut sınıf veya normal bir Java sınıfı olabilir. Örneğimiz için, test amacıyla geçersiz
- Alt Sınıf1 (CrunchifyEbay.java)
- Sınıfın CrunchfiyCompany sınıfını genişlettiğine dikkat edin.
- Alt Sınıf2 (CrunchifyGoogle.java)
- Sınıfın CrunchfiyCompany sınıfını genişlettiğine dikkat edin.
- Fabrika Sınıfı (CrunchifyFactoryPattern.java)
- Artık süper sınıflarımız ve alt sınıflarımız hazır olduğuna göre fabrika sınıfımızı yazabiliriz.
- Fabrika sınıfını Singleton tutabiliriz veya alt sınıfı statik olarak döndüren yöntemi tutabiliriz.
- Giriş parametresine bağlı olarak farklı alt sınıfların oluşturulduğuna ve döndürüldüğüne dikkat edin.
- Test Sınıfı (CrunchifyFactoryPatternTest.java)
- Yukarıdaki fabrika modeli uygulamasını kullanan Basit Test istemci programı.
Diğer okumalı:
- Java'da Thread-Safe ve Hızlı Singleton Uygulaması
- Java'da Daemon Thread nedir? Örnek Ekli
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com . crunchify . tutorials ; /** * @author Crunchify.com */ // Super class in factory pattern can be an interface, abstract class or a // normal java class. For our example, we have super class as abstract class // with overridden toString() method for testing purpose. public abstract class CrunchfiyCompany { public abstract String getPhoneNumber ( ) ; public abstract String getZipCode ( ) ; @Override public String toString ( ) { return "Phone #= " + this . getPhoneNumber ( ) + ", Zip Code= " + this . getZipCode ( ) ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com . crunchify . tutorials ; /** * @author Crunchify.com */ // Notice that the class is extending CrunchfiyCompany class. public class CrunchifyEbay extends CrunchfiyCompany { private String phoneNumber ; private String zipCode ; public CrunchifyEbay ( String phoneNumber , String zipCode ) { this . phoneNumber = phoneNumber ; this . zipCode = zipCode ; } @Override public String getPhoneNumber ( ) { return this . phoneNumber ; } @Override public String getZipCode ( ) { return this . zipCode ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com . crunchify . tutorials ; /** * @author Crunchify.com */ // Notice that the class is extending CrunchfiyCompany class. public class CrunchifyGoogle extends CrunchfiyCompany { private String phoneNumber ; private String zipCode ; public CrunchifyGoogle ( String phoneNumber , String zipCode ) { this . phoneNumber = phoneNumber ; this . zipCode = zipCode ; } @Override public String getPhoneNumber ( ) { return this . phoneNumber ; } @Override public String getZipCode ( ) { return this . zipCode ; } } |

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com . crunchify . tutorials ; import com . crunchify . tutorials . CrunchfiyCompany ; import com . crunchify . tutorials . CrunchifyEbay ; import com . crunchify . tutorials . CrunchifyGoogle ; /** * @author Crunchify.com */ // Now that we have super classes and sub-classes ready, we can write our factory class. // We can keep Factory class Singleton or we can keep the method that return the subclass a static. // Notice that based on the input parameter, different subclass is created and returned. public class CrunchifyFactoryPattern { public static CrunchfiyCompany getDetails ( String type , String phoneNumber , String zipCode ) { if ( "Ebay" . equalsIgnoreCase ( type ) ) return new CrunchifyEbay ( phoneNumber , zipCode ) ; else if ( "Google" . equalsIgnoreCase ( type ) ) return new CrunchifyGoogle ( phoneNumber , zipCode ) ; return null ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com . crunchify . tutorials ; import com . crunchify . tutorials . CrunchfiyCompany ; import com . crunchify . tutorials . CrunchifyFactoryPattern ; /** * @author Crunchify.com */ // Simple Test client program that uses above factory pattern implementation. public class CrunchifyFactoryPatternTest { public static void main ( String [ ] args ) { CrunchfiyCompany eBay = CrunchifyFactoryPattern . getDetails ( "Ebay" , "408.123.4567" , "98765" ) ; CrunchfiyCompany google = CrunchifyFactoryPattern . getDetails ( "Google" , "519.123.4567" , "56789" ) ; System . out . println ( "Factory eBay Config::" + eBay ) ; System . out . println ( "Factory Google Config::" + google ) ; } } |
1 2 |
Factory eBay Config : : Phone #= 408.123.4567, Zip Code= 98765 Factory Google Config : : Phone #= 519.123.4567, Zip Code= 56789 |
Fabrika Kalıbını Kullanan Diğer Örnekler?
- java.util.Calendar, ResourceBundle ve NumberFormat
getInstance()
yöntemleri Fabrika modelini kullanır. - Boolean, Integer vb. sarmalayıcı sınıflarında
valueOf()
yöntemi.
Fabrika Modelinin Faydaları:
- Birden fazla alt sınıfı olan bir süper sınıfımız olduğunda ve girdiye bağlı olarak alt sınıflardan birini döndürmemiz gerektiğinde kullanılır. Bu model, bir sınıfın istemci programından fabrika sınıfına somutlaştırılmasının sorumluluğunu üstlenir.
- Fabrika modeli, uygulama yerine arayüz koduna yaklaşım sağlar.
- Fabrika modeli, gerçek uygulama sınıflarının somutlaştırılmasını istemci kodundan kaldırarak onu daha sağlam, daha az bağlantılı ve genişletilmesi kolay hale getirir. Örneğin, istemci programı bundan habersiz olduğu için PC sınıfı uygulamasını kolayca değiştirebiliriz.
- Fabrika modeli, kalıtım yoluyla uygulama ve istemci sınıfları arasında soyutlama sağlar.
Dezavantajları:
- Fabrika bir nesne ailesi için kullanılmalıdır. Sınıflar ortak temel sınıfı veya arabirimi genişletmiyorsa, fabrika tasarım şablonunda kullanılamazlar.
Tüm Java Web Geliştirme, Spring MVC eğitimlerinin listesi.