post-images/static-factory-method-vs-constructor/cover.jpg

Static Factory Method vs Constructor

Selamlar, ülkemizi muasır medeniyetler seviyesine çıkarmak için yine, yeni ve yeniden karşındayım. Bu yazıda kitabımızın ilk bölümü olan Creating and Destroying Objects (Obje Yaratma ve Yok etme) adımlarından ilki olan Static Factory Methods instead of Constructors (Yapıcılar Yerine Statik Fabrikalar) bölümünden bahsedeceğim. Hangi kitap, ne bölümü? Diye soruların varsa şayet, seni ilk yazıma göz ucuyla bakmaya davet ediyorum.

Nedir bu constructor, ya static factory method? Factory dediğin tasarım modeli olan factory deseni mi? Bu tarz konu içerisindeki kelimelere anlam yüklemeye dayalı soruların varsa ilk önce bunları cevaplayayım. Öncelikle buradaki statik fabrika ile tasarım deseni olan fabrika metodunun (Factory Pattern) bir alakası yok. Aslında yeri gelmişken fabrika metod desenini de hatırlayalım. Bilgilerimizi tazeleyelim.

Fabrika Desen (Factory Pattern); aynı abstract sınıf veya interface’den türeyen nesnelerin üretiminden sorumlu yapıdır. Hali hazırda geliştirmiş olduğun uygulama üzerine yeni özellik eklemek istediğinde mevcut yapıyı zora sokmadan kullanabileceğin bir tasarım modelidir.

Peki, güzel. Nedir bu static factory? Burada aslında sen ve benim gibi zamanında programlama işine yeni adım atmışken farketmediğimiz güzel bir özellik olan Static Factory'den bahsedeceğim.

Nesneye yönelik programlamaya ilk giriştiğin zamanları hatırla. Sana ilk önce temel yapı taşı olan sınıfı (class) anlattılar. Hani ihtiyacın olan ortak değerleri içine eklediğin. Yaş, en, boy, kilo, renk, hacim gibi betimleyici özellikleri de ekledin çiz, boya, ölç, ara gibi eylemleri de. Bunları tanımlarken getter(), setter() da kullandın, yapıcıları da (constructor). Giriş seviyesinde sana öğretilen bu bilgiler, işler daha karmaşıklaştığında yetmemeye başlıyor. Yetmemeyi geçtim sana engel dahi olabiliyor.

Aslında, ilk olarak burada yazımızın başlığı olan nedenleri sıralamak istiyorum.

Neden yapıcılar yerine statik fabrikalar? Şöyle ki:

Constructor’lar doğrudan sınıfın sahip olduğu ismi alırken, static factory’lerde daha anlamlı isimlendirme ile kodun okunabilirliğini zenginleştirebiliyorsun.

Constructor ile yaratılmış bir sınıfım olsun:

public class Yumurta {
   public Yumurta(boolean sucuklu) {
      //yumurta yap  
   }  
}

// Yumurta sınıfına girmeden 'true' değerinin ne olduğunu anlayamam  
Yumurta yumurta = new Yumurta(true);

static factory ile nasıl oluyor görelim.

public class Yumurta {
   public static Yumurta sucukluYumurta() {
     //sucuklu yumurta yap  
   }  
   public static Yumurta peynirliYumurta() {
     //peynirli yumurta yap  
   }  
}

// Görüldüğü üzere kodu daha iyi okuyorsun. Afiyet olsun.  
Yumurta yumurta = Yumurta.sucukluYumurta();
Yumurta yumurta = Yumurta.peynirliYumurta();

Constructor’lar ile her defasında yeni sınıf oluşturarak sistemde ağır yüklere yol açabilecekken, static factory yöntemiyle bir sınıf oluşturup bu sınıfı çoklayabilirsin. Hatta kontrol altında tutabilirsin. Singleton Class üretmek için ideal 😉

EnumSet public bir constructor kullanmaz bunun yerine statik factory metod ile üretilir. Enum türü 64 veya daha az elemana sahipse RegularEnumSet, 65 veya daha fazla elemana sahipse JumboEnumSet nesnesi dönerek yönetmiş olur.

public class Pizza  {
    private boolean sliced;

    public Pizza(boolean sliced) {
        this.sliced = sliced;  
    }

    @Override  
    public String toString() {
        return "Pizza{sliced=" + sliced +'}';  
    }  
}

public class PizzaFactory {
    private static PizzaFactory pizzaFactoryInstance;

    private String pizzaSize;  
    private boolean hasPepperoni;  
    private boolean hasCheese;

    // singleton object control over the instance with static factory model
    public static PizzaFactory getInstance(String pizzaSize, boolean hasPepperoni, boolean hasCheese) {
        PizzaFactory pizzaFactory = new PizzaFactory();

        if (pizzaFactoryInstance != null) {
            pizzaFactory = pizzaFactoryInstance;  
        } else {
            pizzaFactory.pizzaSize = pizzaSize;  
            pizzaFactory.hasPepperoni = hasPepperoni;  
            pizzaFactory.hasCheese = hasCheese;  
            pizzaFactoryInstance = pizzaFactory;  
        }

        return pizzaFactory;  
    }

    public static String slicedPizza() {
        return "Sliced pizza.";  
    }

    public static String unSlicedPizza() {
        return "Unsliced pizza.";  
    }

    @Override  
    public String toString() {
        return "PizzaFactory{" +  
                "pizzaSize='" + pizzaSize + '\\'' +  
                ", hasPepperoni=" + hasPepperoni +  
                ", hasCheese=" + hasCheese +  
                '}';  
    }  
}

Unutmadan söyleyeyim. Yazıların içerisinde yer alan kod parçalarını github hesabımdan paylaşıyor olacağım girip inceleyebilir beğenirsen yıldızlandırabilirsin 🤗

Adiós 🙋🏻‍♂️

JavaEffective JavaCreating and Destroying ObjectsStatic FactoryConstructorFactory PatternSingleton Class