Menu
Coddy logo textTech

Factory Kalıbı

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 66 / 87.

Factory Pattern, nesne oluşturma işlemini ayrı bir metoda veya sınıfa devreden yaratıcı bir tasarım desenidir. Kodunuzda doğrudan new kullanmak yerine, nesneleri sizin için oluşturması amacıyla bir fabrikadan yardım istersiniz. Bu, ortak bir arayüzü veya üst sınıfı paylaşan birden fazla ilişkili sınıfa sahip olduğunuzda özellikle kullanışlıdır.

E-posta, SMS veya anlık bildirim gönderebilen bir bildirim sistemi düşünün. Bir fabrika olmadan kodunuzun her somut sınıf hakkında bilgi sahibi olması gerekirdi:

// Factory olmadan - istemci tüm somut sınıfları bilmelidir
Notification notification;
if (type.equals("email")) {
    notification = new EmailNotification();
} else if (type.equals("sms")) {
    notification = new SMSNotification();
}

Factory Pattern ile bu oluşturma mantığını merkezileştirirsiniz:

public interface Notification {
    void send(String message);
}

public class EmailNotification implements Notification {
    public void send(String message) {
        System.out.println("Email: " + message);
    }
}

public class SMSNotification implements Notification {
    public void send(String message) {
        System.out.println("SMS: " + message);
    }
}

public class NotificationFactory {
    public static Notification create(String type) {
        if (type.equals("email")) {
            return new EmailNotification();
        } else if (type.equals("sms")) {
            return new SMSNotification();
        }
        return null;
    }
}

Artık istemci kodu daha temiz ve somut sınıflara bağlı değil:

Notification notification = NotificationFactory.create("email");
notification.send("Hello!");  // Çıktı: Email: Hello!

Temel fayda, yeni bildirim türleri eklemenin yalnızca fabrikayı güncellemeyi gerektirmesidir: istemci kodu değişmeden kalır. Bu, bir arayüze göre programlama ilkesini izleyerek sisteminizi daha esnek ve genişletilmesini daha kolay hâle getirir.

challenge icon

Görev

Kolay

Factory Pattern'ı kullanarak bir şekil çizim sistemi oluşturalım! Kodunuzun her yerinde şekil nesnelerini doğrudan oluşturmak yerine, oluşturma mantığını basit bir dize tanımlayıcısına göre farklı şekil türleri üreten bir factory'de merkezileştireceksiniz.

Kodunuzu dört dosya halinde düzenleyeceksiniz:

  • Shape.java: Tüm şekiller için ortak sözleşme görevi gören Shape adlı bir arayüz tanımlayın. Arayüzünüz, hiçbir şey döndürmeyen ancak çizilen şekil hakkında bilgi yazdıran tek bir draw() yöntemi bildirmelidir.
  • Shapes.java: Shape arayüzünüzü uygulayan üç sınıf oluşturun:

    Circle - draw() yöntemi Drawing a Circle yazdırmalıdır.

    Rectangle - draw() yöntemi Drawing a Rectangle yazdırmalıdır.

    Triangle - draw() yöntemi Drawing a Triangle yazdırmalıdır.

  • ShapeFactory.java: Şekil oluşturma işlemini yöneten factory sınıfını oluşturun. ShapeFactory, bir createShape(String type) döndüren statik bir Shape yöntemine sahip olmalıdır. type parametresine göre:
    • type "circle" değerine eşitse yeni bir Circle döndürün
    • type "rectangle" değerine eşitse yeni bir Rectangle döndürün
    • type "triangle" değerine eşitse yeni bir Triangle döndürün
    • Diğer tüm değerler için null döndürün
  • Main.java: Factory sisteminizi bir araya getirin! İki girdi alacaksınız: iki şekil türü (ikisi de String).

    Her girdi için şekli oluşturmak üzere ShapeFactory kullanın ve şekli bir Shape değişkeninde saklayın. Factory geçerli bir şekil döndürürse (null değilse) şeklin draw() yöntemini çağırın. null döndürürse, [type] sağlanan girdi olacak şekilde Unknown shape: [type] yazdırın.

    Her iki girdiyi sırayla işleyin ve her birini kendi çıktı satırında yazdırın.

İki girdiyi sırayla alacaksınız: ilk şekil türü (String) ve ikinci şekil türü (String).

Main sınıfınızın hiçbir zaman doğrudan new Circle() veya new Rectangle() kullanmadığına dikkat edin. Yalnızca Shape arayüzünü bilir ve nesneleri oluşturması için factory'ye başvurur. Factory Pattern'ın gücü budur: istemci kodu somut sınıflardan ayrıştırılmıştır!

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // İki şekil türünü oku
        String type1 = scanner.nextLine();
        String type2 = scanner.nextLine();
        
        // TODO: İlk şekli oluşturmak için ShapeFactory kullan
        // Eğer şekil null değilse, draw() çağır
        // If the shape is null, print "Unknown shape: [type]"
        
        // TODO: İkinci şekil için de aynısını yap
        
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Java derleyicisi