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)); // trueBu ö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.
Görev
KolayBasit 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 birNotificationsınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:- Bir
String messagealanı - Mesajı başlatan özel bir adlandırılmış yapıcı
Notification._internal typeparametresine 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, birEmailNotificationdöndürün - Eğer type
'sms'ise, birSMSNotificationdöndürün - Aksi takdirde, bir
PushNotificationdöndürün
- Eğer type
Sending: [message]yazdıran birsend()metodu
- Bir
Aynı dosyada, Notification sınıfını genişleten üç alt sınıf oluşturun:
EmailNotification:Email: [message]yazdırmak içinsend()metodunu geçersiz kılın (override)SMSNotification:SMS: [message]yazdırmak içinsend()metodunu geçersiz kılın (override)PushNotification:Push: [message]yazdırmak içinsend()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)
send()metodunu çağırın.
Beklenen çıktı:
Email: Welcome!
SMS: Your code is 1234
Push: New update availableKopya 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)); // trueFarklı 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
}
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
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı