Builder design pattern'ini bir aptala anlatır gibi Java ile anlatır mısın?



Elbette, Builder tasarım kalıbını basit bir Java örneğiyle anlatayım. Diyelim ki bir "Ev" nesnesi oluşturmak istiyorsunuz ve bu evin birçok farklı özelliği var: adres, kat sayısı, oda sayısı, garaj var mı, havuz var mı gibi. Builder tasarım kalıbı, bu tür karmaşık nesneleri adım adım inşa etmek için kullanılır.


House sınıfı için bir Builder arayüzü tanımlayacağım ve bu arayüzü uygulayan bir iç sınıf oluşturacağım. House sınıfının yapıcısı, bu Builder sınıfından bir örnek alacak.


İlk olarak, Builder arayüzümüzü tanımlayalım:


java

Copy code

// Builder Arayüzü

public interface HouseBuilder {

    HouseBuilder address(String address);

    HouseBuilder numberOfFloors(int numberOfFloors);

    HouseBuilder numberOfRooms(int numberOfRooms);

    HouseBuilder hasGarden(boolean hasGarden);

    House build();

}

Şimdi, House sınıfını ve bu arayüzü uygulayan iç sınıfı oluşturalım:


java

Copy code

// House sınıfı

public class House {

    private String address;

    private int numberOfFloors;

    private int numberOfRooms;

    private boolean hasGarden;


    // House yapıcısı, Builder sınıfından bir örnek alır

    public House(HouseBuilder builder) {

        this.address = builder.address();

        this.numberOfFloors = builder.numberOfFloors();

        this.numberOfRooms = builder.numberOfRooms();

        this.hasGarden = builder.hasGarden();

    }


    // HouseBuilder iç sınıfı, HouseBuilder arayüzünü uygular

    public static class Builder implements HouseBuilder {

        private String address;

        private int numberOfFloors;

        private int numberOfRooms;

        private boolean hasGarden;


        @Override

        public HouseBuilder address(String address) {

            this.address = address;

            return this;

        }


        @Override

        public HouseBuilder numberOfFloors(int numberOfFloors) {

            this.numberOfFloors = numberOfFloors;

            return this;

        }


        @Override

        public HouseBuilder numberOfRooms(int numberOfRooms) {

            this.numberOfRooms = numberOfRooms;

            return this;

        }


        @Override

        public HouseBuilder hasGarden(boolean hasGarden) {

            this.hasGarden = hasGarden;

            return this;

        }


        @Override

        public House build() {

            return new House(this);

        }


        // Getter metotları

        public String address() { return address; }

        public int numberOfFloors() { return numberOfFloors; }

        public int numberOfRooms() { return numberOfRooms; }

        public boolean hasGarden() { return hasGarden; }

    }

}

Bu yapıda, House sınıfının yapıcısı (constructor), HouseBuilder arayüzünü uygulayan Builder iç sınıfından bir örneği alır. Builder sınıfı, zincirleme metotlar kullanarak House nesnesinin özelliklerini belirler ve build() metodu ile House nesnesini oluşturur.


Nesne oluşturmak için şu şekilde kullanabilirsiniz:


java

Copy code

House house = new House.Builder()

                    .address("1234 Elm Street")

                    .numberOfFloors(2)

                    .numberOfRooms(3)

                    .hasGarden(true)

                    .build();

Bu örnekte, House nesnesi, iç içe Builder sınıfı üzerinde zincirleme metod çağrıları kullanılarak oluşturulur. Bu yaklaşım, nesne oluşturma işlemini daha anlaşılır ve esnek hale getirir.


Avantajları

Builder tasarım kalıbının kullanılmasının birçok avantajı vardır, özellikle karmaşık nesneler oluştururken. İşte en önemli avantajları:


Daha İyi Okunabilirlik ve Anlaşılabilirlik: Builder kalıbı, nesne oluşturma işlemini adımlara ayırır, böylece kod daha anlaşılır ve okunması daha kolay hale gelir. Uzun yapıcı (constructor) parametre listeleri yerine, anlamı açık metodlar kullanılır.


Değişmezlik (Immutability) Desteği: Builder, değişmez nesneler oluşturmayı kolaylaştırır. Nesnenin tüm özellikleri, yapıcı metodda bir kere ayarlandıktan sonra değiştirilemez. Bu, nesnenin durumunun güvenliği açısından önemlidir.


Esneklik: Builder kalıbı, isteğe bağlı parametreleri yönetmeyi kolaylaştırır. Tüm olası parametre kombinasyonları için ayrı yapıcı metodlar yazmak yerine, sadece ihtiyacınız olan özellikleri belirterek nesneler oluşturabilirsiniz.


Zincirleme Metod Çağrıları (Method Chaining): Builder sınıfındaki metodlar, genellikle kendisini döndürür (this), bu da metodları bir zincir gibi birbirine bağlamayı sağlar. Bu, kodun daha sade ve anlaşılır olmasını sağlar.


Nesne Oluşturma Sürecini Ayırma ve Kontrol: Builder, nesne oluşturma sürecini, nesnenin temsil ettiği sınıftan ayırır. Bu, oluşturma sürecinin daha kontrol edilebilir ve modüler olmasını sağlar.


Geçerli Nesne Durumları: Builder, nesnenin geçerli bir durumda oluşturulmasını sağlar, çünkü nesne, builder üzerindeki tüm gerekli ayarlamalar yapıldıktan sonra oluşturulur.


Tekrar Kullanılabilirlik: Aynı builder sınıfı, farklı özelliklerle farklı nesneler oluşturmak için yeniden kullanılabilir, bu da kod tekrarını azaltır.


Bu avantajlar, Builder tasarım kalıbını özellikle karmaşık nesnelerin oluşturulmasında veya nesnelerin oluşturulmasında çok sayıda parametre gerektiğinde tercih edilen bir yöntem yapar.


Dezavantajları

Builder tasarım kalıbının kullanımı birçok avantaj sağlasa da, bazı dezavantajları da vardır. Bunları anlamak, bu kalıbın ne zaman ve nasıl kullanılacağına karar verirken yardımcı olabilir:


Ekstra Kod ve Karmaşıklık: Builder kalıbı, basit nesneler için gereksiz yere karmaşıklık ve fazladan kod yazılmasına sebep olabilir. Her yeni sınıf için bir Builder sınıfı yazmak gerektiğinde, bu durum proje üzerinde ekstra bir kod yükü oluşturabilir.


Öğrenme Eğrisi: Builder kalıbı, özellikle yeni başlayanlar için karmaşık gelebilir. Nesne oluşturma sürecini anlamak ve uygulamak, basit yapıcı metotlara (constructors) göre daha zor olabilir.


Performans Etkisi: Nesne oluşturmak için ekstra bir sınıf (Builder) kullanmak, özellikle nesne oluşturma işleminin çok sık yapıldığı durumlarda performans üzerinde olumsuz bir etki yaratabilir.


Bakım ve Güncelleme Zorlukları: Builder sınıfı, ana sınıfın yapısıyla yakından ilişkilidir. Ana sınıfta yapılan değişikliklerin Builder sınıfına da yansıtılması gerekir. Bu durum, kodun bakımını ve güncellenmesini zorlaştırabilir.


Seri Hale Getirme ve Eşzamanlılıkla İlgili Sorunlar: Builder kalıbı, nesnenin seri hale getirilmesi (serialization) ve eşzamanlılık (concurrency) gibi ileri düzey konularda ekstra düşünce ve dikkat gerektirebilir.


Bu dezavantajlar göz önünde bulundurularak, Builder tasarım kalıbının özellikle karmaşık nesneler veya çok sayıda isteğe bağlı parametreye sahip nesneler için uygun olduğunu söyleyebiliriz. Basit nesneler için ise, bu kalıbı kullanmak bazen gereksiz olabilir. Tasarım kararları verirken, projenin ihtiyaçlarına ve karmaşıklık seviyesine göre dengeli bir yaklaşım benimsemek önemlidir.

Hiç yorum yok

Rastgele İçerik

DonanımHaber

© tüm hakları saklıdır
made with by templateszoo