Design Pattern – Factory Pattern Nedir?
Bu yazıda Factory Pattern nedir? Hangi amaç ile kullanılır? Ne gibi durumlarda kullanmamız gerekir? Konularından bahseceğim.
Oluşturduğumuz bir interface ya da abstract sınıftan türeterek başka bir sınıf oluşturma işlemine verilen addır Factory Pattern. Oldukça sık kullanılan bu pattern aynı özelliği kullanmak isteyen sınıflar tarafından kullanılır.
Daha somut bir örnek ile açıklayalım.
Yapacağımız örnekte bir Araba’nın özelliklerini bildirecek bir yazılım yapacağız. Kullanıcı araba seçecek ancak seçilen arabanın hatchback mi yoksa sedan özellikli olacağını bilmiyoruz ve bu değişkenlik gösterebilir. Kullanıcının seçimine bırakılan bu işlemde kullanıcının her seçiminde kod değişikliği yapmamak için Factory Pattern’e uygun bu örneği yazacağız.
Örneğimizin diagramını bir bakalım.
Şimdi Araba interfacemizi oluşturalım.
public interface Araba { public abstract String getTip(); }
Arabamızın bir tipi olucak Hatchback ya da sedan.
Şimdi Hatchback ya da Sedan tiplerini oluşturacak Modellerimizi oluşturalım. Bu modeller arabaya bağlı olacağı için Araba interfacemizi implement edeceğiz.
public class Hatchback implements Araba{ public String getTip() { return "Hatchback Tipinde Araba Seçildi."; } }
public class Sedan implements Araba { public String getTip() { return "Sedan Tipinde Araba Seçildi."; } }
Modellerimizi oluşturduk. Şimdi sıra geldi en önemli yere. Yapmak istediğimiz şey. Kullanıcı ne zaman araç tipi seçerse o araç tipi nesnesi oluşturulmalı ve ardından işleme devam etmeli. Bunun için bir “Factory” oluşturacağız.
public class ArabaFactory { public static Araba getAraba(String tip){ if("Sedan".equalsIgnoreCase(tip)) return new Sedan(); else if("Hatchback".equalsIgnoreCase(tip)) return new Hatchback(); return null; } }
Kullanıcı araba istiyor ve tipini seçecek. Tip seçildiği anda ilgili nesne oluşturulacak. Yukarıda yaptığımız işlem bu. Şimdi sıra geldi programımızı çalıştırmaya. Main classımızı oluşturalım.
public class MainFactory { public static void main(String[] args) { Araba hatchbackAraba=ArabaFactory.getAraba("Hatchback"); Araba sedanAraba=ArabaFactory.getAraba("Sedan"); System.out.println(hatchbackAraba.getTip()); System.out.println(sedanAraba.getTip()); } }
Programımızdan iki adet araba istedik ve bu arabalar Araba nesnesinden üretilerek ArabaFactory’e göndererek ilgili nesnemizin oluşturulmasını sağladık.
Sonuç olarak ekranda şöyle bir görüntü olmalı.
Hatchback Tipinde Araba Seçildi. Sedan Tipinde Araba Seçildi. Process finished with exit code 0
Projenin Kaynak Kodlarını Github Üzerinden Görünlüte / İndir
Baslik “Factory Method Pattern” olursa daha dogru olur. GOF’a gore Factory pattern : creates objects without exposing the instantiation logic to the client.
Factory Method Pattern: Defines an interface for creating objects, but let subclasses to decide which class to instantiate
Ornekte de anlasilacagi uzere baslik Factory Method Pattern olmali. Buna benzer bir kac tane daha Turkce yazi okudum malesef digerlerinde de benzer sekilde. Onlara da benzer oneride bulundum
Super örnək oldu. Təşəkkürlər
Hangi amaç ile kullanılır? Ne gibi durumlarda kullanmamız gerekir? Konularından bahseceğim. ( BAHSETMEDI )
Emin misin?
”
Yapacağımız örnekte bir Araba’nın özelliklerini bildirecek bir yazılım yapacağız. Kullanıcı araba seçecek ancak seçilen arabanın hatchback mi yoksa sedan özellikli olacağını bilmiyoruz ve bu değişkenlik gösterebilir. Kullanıcının seçimine bırakılan bu işlemde kullanıcının her seçiminde kod değişikliği yapmamak için Factory Pattern’e uygun bu örneği yazacağız.
“
Çok iyi örnekti, ellerinize sağlık. Buna ait abstract class-la olan bir örnek de vere bilirmisiniz rica etsem?