Creational Design Patterns

Sercan Ozbek
5 min readNov 3, 2024

--

Creational Design Patterns Nedir?

Creational Design Patterns (Yaratıcı Tasarım Desenleri), yazılım geliştirmede nesnelerin oluşturulma sürecini yöneten, daha iyi yapılandırılmış ve sürdürülebilir kod yazmayı amaçlayan tasarım desenleridir. Bu desenler, nesne oluşturma süreçlerini soyutlayarak, sistemin esnekliğini artırır ve nesne bağımlılıklarını azaltır. Böylece, uygulamanın farklı bileşenleri arasında daha iyi bir ayrım sağlanır.

1. Singleton Pattern

Singleton deseni, bir sınıfın yalnızca bir örneğinin oluşturulmasını garanti eder ve bu örneğe global bir erişim noktası sağlar. Bu, belirli bir nesneye sadece bir kez erişim gerektiğinde kullanışlıdır.

Kullanım Senaryosu: Örneğin, bir uygulamanın veritabanı bağlantısı yöneticisi ya da uygulama ayarlarını tutan bir yapı sınıfı yalnızca bir kez oluşturulmalı ve tüm uygulama boyunca aynı örnek kullanılmalıdır.

Faydaları:

  • Hafıza yönetimi sağlar, çünkü yalnızca bir nesne oluşturulur.
  • Küresel erişim noktası sunar, böylece uygulamanın farklı yerlerinden bu nesneye kolayca erişilebilir.

Kod Örneği:

@Component
public class SingletonService {
private static SingletonService instance;

// Yapıcı metot private, dışarıdan erişime kapalı
private SingletonService() {}

// Erişim noktası
public static synchronized SingletonService getInstance() {
if (instance == null) {
instance = new SingletonService(); // Yeni örnek oluştur
}
return instance; // Var olan örneği döndür
}

public String getMessage() {
return "Singleton Service'e hoş geldiniz!"; // Test mesajı
}
}

Açıklama:

  • private SingletonService(): Yapıcı metot (constructor) private olarak tanımlanmıştır, böylece dışarıdan yeni bir örnek oluşturulamaz.
  • getInstance(): Bu metot, sınıfın tek örneğine erişmek için kullanılır. Eğer örnek mevcut değilse, yeni bir örnek oluşturur. synchronized anahtar kelimesi, çoklu iş parçacıklarında güvenliği sağlamak için kullanılır.

2. Factory Method Pattern

Factory Method deseni, bir nesne oluşturma işlemini alt sınıflara bırakan bir arayüz tanımlar. Bu, bir sınıfın nesnelerini oluşturan bir metot sağlar, fakat hangi sınıfın örneğinin oluşturulacağını alt sınıflar belirler.

Kullanım Senaryosu: Farklı türlerde ürünlerin yaratılması gerektiğinde kullanılır. Örneğin, bir otomobil fabrikası, farklı otomobil modelleri üretmek için bir fabrika yöntemi kullanabilir.

Faydaları:

  • Esneklik sağlar; yeni ürün türleri eklenmesi kolaydır.
  • Kodun test edilmesini ve bakımını kolaylaştırır.

Kod Örneği:

interface Product {
String getName(); // Ürün adı döndüren metot
}

class ConcreteProductA implements Product {
public String getName() {
return "Ürün A"; // Ürün A'nın adını döndür
}
}

class ConcreteProductB implements Product {
public String getName() {
return "Ürün B"; // Ürün B'nin adını döndür
}
}

abstract class Creator {
public abstract Product factoryMethod(); // Alt sınıflar tarafından uygulanacak metot
}

class CreatorA extends Creator {
public Product factoryMethod() {
return new ConcreteProductA(); // Ürün A oluştur
}
}

class CreatorB extends Creator {
public Product factoryMethod() {
return new ConcreteProductB(); // Ürün B oluştur
}
}

Açıklama:

  • Product arayüzü, tüm ürünlerin ortak metodunu tanımlar.
  • Creator sınıfı, hangi tür ürünlerin yaratılacağını belirleyen alt sınıflara sahiptir. CreatorA ve CreatorB, factoryMethod metodunu uygulayarak kendi ürünlerini oluşturur.

3. Abstract Factory Pattern

Abstract Factory deseni, bir grup ilişkili veya bağımlı nesneleri oluşturan bir arayüz sağlar. Bu, kullanıcıların nesneleri oluşturmak için hangi sınıfı kullandığını bilmesine gerek kalmadan farklı ürünlerin yaratılmasını sağlar.

Kullanım Senaryosu: UI bileşenleri gibi birden fazla türde ürün grubunun yaratılması gerektiğinde kullanılır. Örneğin, bir masaüstü ve mobil uygulamanın farklı temalarını oluşturmak için kullanılabilir.

Faydaları:

  • Ürünlerin oluşturulmasında tutarlılık sağlar.
  • Uygulama kodunu, spesifik ürün sınıflarına olan bağımlılıklardan kurtarır.

Kod Örneği:

interface AbstractFactory {
Product createProduct(); // Ürün oluşturma metodu
}

class FactoryA implements AbstractFactory {
public Product createProduct() {
return new ConcreteProductA(); // Factory A ile Ürün A oluştur
}
}

class FactoryB implements AbstractFactory {
public Product createProduct() {
return new ConcreteProductB(); // Factory B ile Ürün B oluştur
}
}

Açıklama:

  • AbstractFactory arayüzü, farklı ürünleri oluşturmak için bir metod tanımlar.
  • FactoryA ve FactoryB, createProduct metodunu uygulayarak kendi ürünlerini oluşturur. Bu sayede, kullanıcılar yalnızca gerekli fabrika sınıfını seçerek ürünleri alabilirler.

4. Builder Pattern

Builder deseni, karmaşık nesnelerin adım adım inşa edilmesini sağlar. Bu desen, bir nesnenin oluşturulma sürecini soyutlayarak, nesnenin farklı yapılandırmalarını kolayca oluşturmanıza olanak tanır.

Kullanım Senaryosu: Bir nesnenin oluşturulması için birçok adımın gerektiği durumlarda kullanılır. Örneğin, bir konutun inşası veya bir raporun oluşturulması gibi durumlar.

Faydaları:

  • Nesne oluşturma sürecini ve karmaşık nesneleri yönetmeyi kolaylaştırır.
  • Kodun okunabilirliğini artırır, çünkü nesneler adım adım oluşturulur.

Kod Örneği:

class Product {
private String partA;
private String partB;

public void setPartA(String partA) {
this.partA = partA; // Parça A ayarla
}

public void setPartB(String partB) {
this.partB = partB; // Parça B ayarla
}

@Override
public String toString() {
return "Product with PartA: " + partA + " and PartB: " + partB; // Ürün bilgilerini döndür
}
}

class ProductBuilder {
private Product product;

public ProductBuilder() {
product = new Product(); // Yeni bir ürün oluştur
}

public ProductBuilder buildPartA(String partA) {
product.setPartA(partA); // Parça A'yı ekle
return this; // Builder'ı geri döndür
}

public ProductBuilder buildPartB(String partB) {
product.setPartB(partB); // Parça B'yi ekle
return this; // Builder'ı geri döndür
}

public Product build() {
return product; // Tamamlanmış ürünü döndür
}
}

Açıklama:

  • Product sınıfı, ürünün parçalarını saklar ve toString metodu ile ürün bilgilerini döndürür.
  • ProductBuilder sınıfı, ürün oluşturma sürecini yönetir. buildPartA ve buildPartB metodları, ürüne parçaları ekler ve kendisini döndürür, böylece metot zinciri kullanarak okunabilir bir kod akışı sağlar.

5. Prototype Pattern

Prototype deseni, var olan nesneleri kopyalayarak yeni nesneler oluşturmayı sağlar. Bu desen, özellikle nesne oluşturma maliyetinin yüksek olduğu durumlarda faydalıdır.

Kullanım Senaryosu: Nesnelerin sıklıkla yaratılıp silindiği durumlarda kullanılır. Örneğin, oyunlarda karakterlerin veya nesnelerin kopyalanması.

Faydaları:

  • Kopyalama süreci, nesne oluşturma sürecinden daha hızlıdır.
  • Nesne oluşturma maliyetini düşürür.

Kod Örneği:

class Prototype implements Cloneable {
private String value;

public Prototype(String value) {
this.value = value; // Değeri ayarla
}

public Prototype clone() throws CloneNotSupportedException {
return (Prototype) super.clone(); // Nesneyi kopyala
}

@Override
public String toString() {
return "Prototype with value: " + value; // Kopyalanan nesne bilgilerini döndür
}
}

Açıklama:

  • Prototype sınıfı, Cloneable arayüzünü uygular. clone metodu, mevcut nesneyi kopyalamak için kullanılır.
  • toString metodu, nesnenin değerini döndürür.

SONUÇ

Creational Design Patterns, yazılım projelerinde esneklik ve sürdürülebilirlik sağlamak için kritik öneme sahiptir. Bu desenlerin doğru bir şekilde uygulanması, geliştiricilere daha düzenli ve bakımının kolay olduğu bir kod yapısı sunar. Ayrıca, farklı nesne türlerinin yönetimini ve oluşturulmasını kolaylaştırarak, projelerin daha hızlı geliştirilmesine katkıda bulunur.

Bu desenlerin uygulandığı projelerde, gereksinim değişikliklerine hızlı bir şekilde adapte olma yeteneği artar, böylece projenin genel kalitesi ve performansı da yükselir.

Tüm yazılarımı https://sercanozbek.medium.com/ adresinden inceleyebilirsiniz.

Bana ulaşmak için: LinkedIn

--

--

Sercan Ozbek
Sercan Ozbek

No responses yet