Builder Pattern

[en] Read in English

2023-05-26

Bir zamanlar, çok güzel bir krallık vardı ve bu krallığın adı “Builder Pattern"di. Bu krallıkta her şey, karmaşık nesneleri adım adım oluşturma ve onları birbirine bağlama sanatı hakkındaydı. Bu karmaşık nesneler, krallığın en değerli hazineleriydi ve her biri özenle ve düşünerek inşa edilmişti.

Krallığın en bilge insanı, Yapıcı (Builder) adındaki bu usta idi. Yapıcı, taşlar, tuğlalar ve ahşap gibi malzemeleri kullanarak karmaşık nesneler inşa ederdi. Fakat Yapıcı, her şeyi kendi başına yapmazdı. Ona yardımcı olmak için bir Yönetici (Director) vardı. Yönetici, Yapıcı’ya hangi parçaları hangi sırayla inşa etmesi gerektiğini söylerdi. Böylece, Yapıcı’nın sadece nesnenin inşasına odaklanmasını sağlardı.

C# dilinde bu hikaye şu şekilde uygulanır:

public interface IBuilder
{
    void BuildPartA();
    void BuildPartB();
    void BuildPartC();
}

public class ConcreteBuilder : IBuilder
{
    public void BuildPartA()
    {
        // Inşa et PartA
    }

    public void BuildPartB()
    {
        // Inşa et PartB
    }

    public void BuildPartC()
    {
        // Inşa et PartC
    }
}

public class Director
{
    public void Construct(IBuilder builder)
    {
        builder.BuildPartA();
        builder.BuildPartB();
        builder.BuildPartC();
    }
}

Java dilinde aynı hikaye:

public interface Builder {
    void buildPartA();
    void buildPartB();
    void buildPartC();
}

public class ConcreteBuilder implements Builder {
    public void buildPartA() {
        // Inşa et PartA
    }
    public void buildPartB() {
        // Inşa et PartB
    }
    public void buildPartC() {
        // Inşa et PartC
    }
}

public class Director {
    public void construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
    }
}

Python dilinde:

from abc import ABC, abstractmethod

class Builder(ABC):
    @abstractmethod
    def build_part_a(self):
        pass

    @abstractmethod
    def build_part_b(self):
        pass

    @abstractmethod
    def build_part_c(self):
        pass

class ConcreteBuilder(Builder):
    def build_part_a(self):
        # Inşa et PartA
        pass

    def build_part_b(self):
        # Inşa et PartB
        pass

    def build_part_c(self):
        # Inşa et PartC
        pass

class Director:
    def construct(self, builder):
        builder.build_part_a()
        builder.build_part_b()
        builder.build_part_c()

Go dilinde bu hikaye:

type Builder interface {
	BuildPartA()
	BuildPartB()
	BuildPartC()
}

type ConcreteBuilder struct{}

func (b *ConcreteBuilder) BuildPartA() {
	// Inşa et PartA
}

func (b *ConcreteBuilder) BuildPartB() {
	// Inşa et PartB
}

func (b *ConcreteBuilder) BuildPartC() {
	// Inşa et PartC
}

type Director struct{}

func (d *Director) Construct(builder Builder) {
	builder.BuildPartA()
	builder.BuildPartB()
	builder.BuildPartC()
}

Rust dilinde bu hikaye:

pub trait Builder {
    fn build_part_a(&mut self);
    fn build_part_b(&mut self);
    fn build_part_c(&mut self);
}

pub struct ConcreteBuilder;

impl Builder for ConcreteBuilder {
    fn build_part_a(&mut self) {
        // Inşa et PartA
    }
    fn build_part_b(&mut self) {
        // Inşa et PartB
    }
    fn build_part_c(&mut self) {
        // Inşa et PartC
    }
}

pub struct Director;

impl Director {
    pub fn construct(&self, builder: &mut dyn Builder) {
        builder.build_part_a();
        builder.build_part_b();
        builder.build_part_c();
    }
}

Ve böylece, Yapıcı ve Yönetici’nin bu karmaşık nesneleri nasıl inşa ettiklerini gördük. Her bir parçanın ayrı ayrı ve sırayla inşa edilmesi, nesnenin son hali için önemliydi. Ayrıca, Yönetici’nin varlığı, Yapıcı’nın nasıl ve hangi sırayla çalışması gerektiğini belirlemesine yardımcı olur. Bu, kodun daha düzenli, anlaşılır ve esnek olmasını sağlar, çünkü farklı Yapıcıları kullanarak farklı nesneler oluşturabiliriz. Bu hikaye, Builder tasarım kalıbının nasıl çalıştığını ve nasıl kullanılacağını gösterir. Bu kalıp, karmaşık nesneleri oluşturmanın bir yolunu sağlar ve kodun bakımını ve genişletilebilirliğini kolaylaştırır.



Bu gibi daha fazla gönderi...

Bileşenlerin Dansı: Composite Tasarım Kalıbı

2023-06-22 | #composite-pattern #design-patterns #structural-patterns

Bir zamanlar, bir ormanda bir ağaç vardı. Bu ağaç, yaprakları ve dalları olan karmaşık bir yapıydı. Her dalın üzerinde daha küçük dallar ve yapraklar bulunabilirdi. Ağaç, dallarını ve yapraklarını bir arada tutan bir bütün olarak çalışıyordu. Bu ağaç, Composite tasarım kalıbının bir örneğidir. Ağaç (Composite), dallar (yine Composite) ve yapraklar (Leaf) olmak üzere iki tür bileşen içerir. Hem dallar hem de yapraklar, ağaç tarafından tanınan aynı arayüzü (Component) uygular. Bu sayede ağaç, dallarını ve yapraklarını aynı şekilde işleyebilir.

Devamı 


Köprüler Kurarak Esneklik Kazanın: Bridge Tasarım Kalıbı İle Çözümlemeler ve Dört Farklı Dilde Uygulamalar

2023-06-22 | #bridge-pattern #design-patterns #structural-patterns

Bir zamanlar, iki krallık varmış. Bu krallıklar birbirlerine çok yakın olmasına rağmen, aralarında geniş ve derin bir nehir bulunuyormuş. Bu nehir, krallıkların birbirleriyle etkileşim kurmasını zorlaştırıyormuş. Bu durumu çözmek için, her iki krallık da bir köprü inşa etmeye karar vermiş. Bu köprü, iki krallık arasında iletişimi sağlayan bir arayüz olmuş. Ancak, köprünün her iki tarafında farklı yapılar ve özellikler bulunuyormuş. Bir taraf taştan, diğer taraf ise ahşaptan yapılmış. Bu durum, köprünün her iki tarafının birbirinden bağımsız olarak değiştirilebilmesini sağlamış.

Devamı 


Dekoratör Tasarım Deseni: Yazılımın Süsleyicileri

2023-06-15 | #decorator-pattern #design-patterns #structural-patterns

Bir zamanlar, bir “Component” adında bir nesne varmış. Bu nesne, belirli bir işlevi yerine getirmek için kullanılırmış. Ancak, bazen bu işlevi genişletmek veya değiştirmek gerekiyormuş. İşte bu noktada “Decorator"lar devreye giriyormuş. Decorator’lar, Component’i “süsleyen” veya genişleten nesnelerdir. Bir Decorator, bir Component’in üzerine gelir ve onun işlevini genişletir veya değiştirir. Bu, Component’in kendisini değiştirmeden, onun işlevselliğini genişletmek için kullanılır. Örneğin, bir “TextComponent” düşünün. Bu component, bir metni ekrana yazdırır. Ancak, bazen metni kalın veya italik yapmak isteyebiliriz.

Devamı 