Konstruktor Factory
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 14 dari 110.
factory constructor adalah constructor khusus yang tidak selalu membuat instance baru. Tidak seperti constructor biasa, factory constructor dapat mengembalikan instance yang sudah ada, subtype, atau bahkan null (jika nullable). Kamu mendeklarasikannya menggunakan kata kunci factory.
class Logger {
static final Logger _instance = Logger._internal();
// Constructor bernama privat
Logger._internal();
// Constructor factory
factory Logger() {
return _instance;
}
}
Logger log1 = Logger();
Logger log2 = Logger();
print(identical(log1, log2)); // trueDalam contoh ini, konstruktor factory selalu mengembalikan instance yang sama. Berapa kali pun kamu memanggil Logger(), kamu mendapatkan object yang identik. Pola ini umum digunakan untuk mengimplementasikan singleton.
Factory constructor berbeda dari constructor biasa dalam satu hal penting: factory constructor tidak memiliki akses ke this karena mungkin tidak membuat instance baru sama sekali. Sebaliknya, factory constructor harus mengembalikan object secara eksplisit:
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._(); }Constructor factory berguna saat kamu perlu mengontrol pembuatan instance, seperti mengembalikan object yang disimpan dalam cache, menerapkan kumpulan object, atau menentukan subtype mana yang akan dibuat berdasarkan parameter input.
Tantangan
MudahMari kita buat sistem notifikasi yang menggunakan konstruktor factory untuk membuat berbagai jenis notifikasi berdasarkan input string sederhana.
Kamu akan membuat dua file untuk mengatur kodemu:
notification.dart: Definisikan classNotificationyang menjadi dasar untuk semua jenis notifikasi. Class-mu harus memiliki:- Field
String message - Konstruktor bernama privat
Notification._internalyang menginisialisasi message - Konstruktor factory
Notification(String type, String message)yang mengembalikan subtype notifikasi yang berbeda berdasarkan parametertype:- Jika type adalah
'email', kembalikanEmailNotification - Jika type adalah
'sms', kembalikanSMSNotification - Jika tidak, kembalikan
PushNotification
- Jika type adalah
- Method
send()yang mencetakSending: [message]
- Field
Di file yang sama, buat tiga subclass yang mewarisi Notification:
EmailNotification: Overridesend()agar mencetakEmail: [message]SMSNotification: Overridesend()agar mencetakSMS: [message]PushNotification: Overridesend()agar mencetakPush: [message]
Setiap subclass memerlukan konstruktor yang menerima message dan meneruskannya ke induk menggunakan super._internal(message).
main.dart: Impor class notifikasimu dan buat tiga notifikasi menggunakan konstruktor factory:- Notifikasi email dengan message
'Welcome!' - Notifikasi SMS dengan message
'Your code is 1234' - Notifikasi push dengan message
'New update available'
send()pada setiap notifikasi sesuai urutan di atas.- Notifikasi email dengan message
Output yang diharapkan:
Email: Welcome!
SMS: Your code is 1234
Push: New update availableCoba sendiri
import 'notification.dart';
void main() {
// TODO: Buat notifikasi email dengan pesan 'Welcome!'
// TODO: Buat notifikasi SMS dengan pesan 'Your code is 1234'
// TODO: Buat notifikasi push dengan pesan 'New update available'
// TODO: Panggil send() pada setiap notifikasi secara berurutan
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses PembayaranLatihan sendiri: Compiler Dart online