Menu
Coddy logo textTech

Fabrika Yapıcıları

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 14 / 110.

Bir factory kurucusu, her zaman yeni bir örnek oluşturmayan özel bir kurucudur. Normal kurucuların aksine, bir factory kurucusu mevcut bir örneği, bir alt türü veya hatta (eğer null olabilirse) null değerini döndürebilir. Bunu factory anahtar kelimesini kullanarak tanımlarsınız.

class Logger {
  static final Logger _instance = Logger._internal();
  
  // Özel adlandırılmış yapıcı
  Logger._internal();
  
  // Fabrika yapıcısı
  factory Logger() {
    return _instance;
  }
}

Logger log1 = Logger();
Logger log2 = Logger();
print(identical(log1, log2)); // true

Bu örnekte, fabrika yapıcısı (factory constructor) her zaman aynı örneği döndürür. Logger() ifadesini kaç kez çağırırsanız çağırın, aynı nesneyi elde edersiniz. Bu desen, singleton yapılarını uygulamak için yaygın olarak kullanılır.

Fabrika kurucuları (factory constructors), normal kuruculardan önemli bir yönden ayrılır: this anahtar kelimesine erişimleri yoktur çünkü hiç yeni bir örnek oluşturmayabilirler. Bunun yerine, açıkça bir nesne döndürmeleri gerekir:

class Shape {
  factory Shape(String type) {
    if (type == 'circle') return Circle();
    if (type == 'square') return Square();
    return Rectangle();
  }
}

class Circle extends Shape { Circle() : super._(); }
class Square extends Shape { Square() : super._(); }
class Rectangle extends Shape { Rectangle() : super._(); }

Factory constructor'lar; önbelleğe alınmış nesneleri döndürmek, nesne havuzları uygulamak veya giriş parametrelerine bağlı olarak hangi alt türün örnekleneceğine karar vermek gibi örnek oluşturma üzerinde kontrole ihtiyaç duyduğunuz durumlarda kullanışlıdır.

challenge icon

Görev

Kolay

Basit bir dize girişine dayalı olarak farklı bildirim türleri oluşturmak için fabrika (factory) yapıcılarını kullanan bir bildirim sistemi oluşturalım.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • notification.dart: Tüm bildirim türleri için temel görevi gören bir Notification sınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:
    • Bir String message alanı
    • Mesajı başlatan özel bir adlandırılmış yapıcı Notification._internal
    • type parametresine bağlı olarak farklı bildirim alt türlerini döndüren bir fabrika yapıcısı Notification(String type, String message):
      • Eğer type 'email' ise, bir EmailNotification döndürün
      • Eğer type 'sms' ise, bir SMSNotification döndürün
      • Aksi takdirde, bir PushNotification döndürün
    • Sending: [message] yazdıran bir send() metodu

Aynı dosyada, Notification sınıfını genişleten üç alt sınıf oluşturun:

  • EmailNotification: Email: [message] yazdırmak için send() metodunu geçersiz kılın (override)
  • SMSNotification: SMS: [message] yazdırmak için send() metodunu geçersiz kılın (override)
  • PushNotification: Push: [message] yazdırmak için send() metodunu geçersiz kılın (override)

Her alt sınıfın, bir message alan ve bunu super._internal(message) kullanarak üst sınıfa ileten bir yapıcıya ihtiyacı vardır.

  • main.dart: Bildirim sınıfınızı içe aktarın ve fabrika yapıcısını kullanarak üç bildirim oluşturun:
    • 'Welcome!' mesajına sahip bir e-posta bildirimi
    • 'Your code is 1234' mesajına sahip bir SMS bildirimi
    • 'New update available' mesajına sahip bir anlık bildirim (push notification)
    Yukarıda listelenen sırayla her bildirim üzerinde send() metodunu çağırın.

Beklenen çıktı:

Email: Welcome!
SMS: Your code is 1234
Push: New update available

Kopya kağıdı

factory kurucusu, her zaman yeni bir örnek oluşturmayan, factory anahtar kelimesiyle bildirilen özel bir kurucudur. Normal kurucuların aksine, mevcut bir örneği, bir alt türü veya null değerini döndürebilir.

Factory kurucularının this ifadesine erişimi yoktur ve açıkça bir nesne döndürmeleri gerekir.

Singleton deseni örneği:

class Logger {
  static final Logger _instance = Logger._internal();
  
  Logger._internal(); // Özel adlandırılmış kurucu
  
  factory Logger() {
    return _instance; // Her zaman aynı örneği döndürür
  }
}

Logger log1 = Logger();
Logger log2 = Logger();
print(identical(log1, log2)); // true

Farklı alt türleri döndürme:

class Shape {
  factory Shape(String type) {
    if (type == 'circle') return Circle();
    if (type == 'square') return Square();
    return Rectangle();
  }
}

class Circle extends Shape { Circle() : super._(); }
class Square extends Shape { Square() : super._(); }
class Rectangle extends Shape { Rectangle() : super._(); }

Factory kurucuları; önbelleğe alınmış nesneleri döndürmek, nesne havuzları uygulamak veya giriş parametrelerine göre hangi alt türün örnekleneceğine karar vermek gibi örnek oluşturma sürecini kontrol etmek için kullanışlıdır.

Kendin dene

import 'notification.dart';

void main() {
  // TODO: 'Welcome!' mesajıyla bir e-posta bildirimi oluşturun
  
  // TODO: 'Your code is 1234' mesajıyla bir SMS bildirimi oluşturun
  
  // TODO: 'New update available' mesajıyla bir push bildirimi oluşturun
  
  // TODO: Sırasıyla her bildirim üzerinde send() metodunu çağırın
}
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