Factory Method Pattern
[en] Read in English 2023-05-26
Bir zamanlar, büyülü bir krallık vardı ve bu krallığın adı “Factory Method"du. Bu krallık, nesnelerin oluşturulmasını denetleyen bir yerdi. Krallığın en bilge hükümdarı, nesnelerin yaratılmasının kendi özel yolları olduğunu düşünüyordu ve bu, onun yönetiminin bir parçasıydı.
Hükümdarın bir prensesi vardı ve adı “Creator"di. Creator, her gün yeni bir nesne oluşturmak için sihirli güçlerini kullanırdı. Ancak Creator, her zaman aynı türde bir nesne yaratmazdı. Bazı günler bir “ProductA” yaratırken, bazı günler ise “ProductB” yaratırdı. Her bir ürünün oluşturulma şekli biraz farklıydı ve bu yüzden Creator’ın her birini ayrı ayrı oluşturması gerekiyordu.
C# dilinde bu hikaye şu şekilde uygulanır:
public abstract class Creator
{
public abstract IProduct FactoryMethod();
}
public class ConcreteCreatorA : Creator
{
public override IProduct FactoryMethod()
{
return new ConcreteProductA();
}
}
public class ConcreteCreatorB : Creator
{
public override IProduct FactoryMethod()
{
return new ConcreteProductB();
}
}
Java dilinde aynı hikaye:
public abstract class Creator {
public abstract Product factoryMethod();
}
public class ConcreteCreatorA extends Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductA();
}
}
public class ConcreteCreatorB extends Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductB();
}
}
Python dilinde:
from abc import ABC, abstractmethod
class Creator(ABC):
@abstractmethod
def factory_method(self):
pass
class ConcreteCreatorA(Creator):
def factory_method(self):
return ConcreteProductA()
class ConcreteCreatorB(Creator):
def factory_method(self):
return ConcreteProductB()
Go dilinde bu hikaye:
type Creator interface {
FactoryMethod() Product
}
type ConcreteCreatorA struct{}
func (c ConcreteCreatorA) FactoryMethod() Product {
return &ConcreteProductA{}
}
type ConcreteCreatorB struct{}
func (c ConcreteCreatorB) FactoryMethod() Product {
return &ConcreteProductB{}
}
Rust dilinde bu hikaye:
pub trait Creator {
fn factory_method(&self) -> Box<dyn Product>;
}
pub struct ConcreteCreatorA;
impl Creator for ConcreteCreatorA {
fn factory_method(&self) -> Box<dyn Product> {
Box::new(ConcreteProductA)
}
}
pub struct ConcreteCreatorB;
impl Creator for ConcreteCreatorB {
fn factory_method(&self) -> Box<dyn Product> {
Box::new(ConcreteProductB)
}
}
Ve böylece, Factory Method krallığında yaşayanlar, Creator’ın nesneleri nasıl yarattığını gördüler. Her Creator, belirli bir ürün tipini oluşturma yeteneğine sahiptir ve bu, kodun daha düzenli, anlaşılır ve esnek olmasını sağlar.
Her yeni ürün tipi için, yeni bir Creator oluşturabiliriz ve bu, Creator’ın yaratıcılık yeteneklerini genişletecektir. Bu hikaye, Factory Method tasarım kalıbının nasıl çalıştığını ve nasıl kullanılacağını gösterir. Bu kalıp, nesnelerin oluşturulmasını denetler ve kodun bakımını ve genişletilebilirliğini kolaylaştırır.