Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 Document dengan method generate(String content) yang mengembalikan String
    • Tiga class konkret yang mengimplementasikan Document:
      • Report, method generate-nya mengembalikan === REPORT ===\n[content]\n=============
      • Invoice, method generate-nya mengembalikan INVOICE\n--------\n[content]\nTotal Due
      • Letter, method generate-nya mengembalikan Dear Reader,\n[content]\nSincerely
    • Class DocumentFactory dengan method statis create(String type) yang mengembalikan Document yang sesuai berdasarkan string tipe: "report", "invoice", atau "letter". Untuk tipe yang tidak dikenal, kembalikan Letter sebagai nilai default
  • 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

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
Sincerely

Coba 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"
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online