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.