Pola Factory
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 91 dari 110.
Pola Factory mendelegasikan pembuatan object ke method atau class terpisah, sehingga kamu dapat membuat object tanpa menentukan class persisnya. Ini berbeda dari konstruktor factory yang kamu pelajari sebelumnya, Pola Factory adalah pendekatan desain yang memusatkan logika pembuatan dan dapat mengembalikan tipe yang berbeda berdasarkan input.
Pertimbangkan skenario ketika kamu perlu membuat berbagai jenis notifikasi. Alih-alih client menentukan class mana yang akan dibuat instance-nya, factory menangani keputusan tersebut:
abstract class Notification {
void send(String message);
}
class EmailNotification implements Notification {
@override
void send(String message) => print('Email: $message');
}
class SMSNotification implements Notification {
@override
void send(String message) => print('SMS: $message');
}
class NotificationFactory {
static Notification create(String type) {
switch (type) {
case 'email':
return EmailNotification();
case 'sms':
return SMSNotification();
default:
return EmailNotification();
}
}
}
void main() {
var notification = NotificationFactory.create('sms');
notification.send('Hello!'); // SMS: Hello!
}Code client tidak perlu mengetahui EmailNotification atau SMSNotification, code client hanya meminta factory untuk membuat notifikasi dengan tipe tertentu. Dengan begitu, penambahan tipe notifikasi baru menjadi mudah: kamu hanya perlu mengubah factory, bukan setiap bagian yang membuat notifikasi.
Gunakan pola Factory ketika pembuatan object melibatkan logika yang rumit, ketika kamu ingin menyembunyikan class implementasi dari client, atau ketika tipe pasti yang akan dibuat bergantung pada kondisi saat program berjalan.
Tantangan
MudahMari buat generator dokumen menggunakan pola Factory! Kamu akan membuat sistem yang menghasilkan berbagai jenis dokumen (laporan, faktur, dan surat) melalui factory terpusat, sehingga kode client tidak perlu mengetahui class dokumen tertentu.
Kamu akan mengatur kodemu dalam dua file:
document_factory.dart: Buat sistem dokumenmu di sini:- abstract class
Documentdengan methodgenerate(String content)yang mengembalikanString - Tiga class konkret yang mengimplementasikan
Document:Report, methodgenerate-nya mengembalikan=== REPORT ===\n[content]\n=============Invoice, methodgenerate-nya mengembalikanINVOICE\n--------\n[content]\nTotal DueLetter, methodgenerate-nya mengembalikanDear Reader,\n[content]\nSincerely
- Class
DocumentFactorydengan method statiscreate(String type)yang mengembalikanDocumentyang sesuai berdasarkan string tipe:"report","invoice", atau"letter". Untuk tipe yang tidak dikenal, kembalikanLettersebagai nilai default
- abstract class
main.dart: Impor factory dokumenmu dan tunjukkan cara factory membuat berbagai jenis dokumen tanpa client perlu mengetahui class konkretnya:- Gunakan factory untuk membuat laporan dan mencetak hasil pembuatannya dengan konten
Sales increased by 25% - Cetak satu baris kosong
- Gunakan factory untuk membuat faktur dan mencetak hasil pembuatannya dengan konten
Widget x3 - $150 - Cetak satu baris kosong
- Gunakan factory untuk membuat surat dan mencetak hasil pembuatannya dengan konten
Thank you for your order
- Gunakan factory untuk membuat laporan dan mencetak hasil pembuatannya dengan konten
Perhatikan bahwa file utama kamu hanya berinteraksi dengan factory dan tipe abstrak Document: file itu tidak pernah membuat object Report, Invoice, atau Letter secara langsung!
Output yang diharapkan:
=== REPORT ===
Sales increased by 25%
=============
INVOICE
--------
Widget x3 - $150
Total Due
Dear Reader,
Thank you for your order
SincerelyCoba sendiri
import 'document_factory.dart';
void main() {
// TODO: Gunakan DocumentFactory.create() untuk membuat laporan
// Lalu cetak hasil pembuatannya dengan konten: "Sales increased by 25%"
// TODO: Cetak baris kosong
// TODO: Gunakan DocumentFactory.create() untuk membuat faktur
// Lalu cetak hasil pembuatannya dengan konten: "Widget x3 - \$150"
// TODO: Cetak baris kosong
// TODO: Gunakan DocumentFactory.create() untuk membuat surat
// Lalu cetak hasil pembuatannya dengan konten: "Thank you for your order"
}
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