Menu
CoddyTech

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)); // true

Dalam 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.

challenge icon

Tantangan

Mudah

Mari 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 class Notification yang menjadi dasar untuk semua jenis notifikasi. Class-mu harus memiliki:
    • Field String message
    • Konstruktor bernama privat Notification._internal yang menginisialisasi message
    • Konstruktor factory Notification(String type, String message) yang mengembalikan subtype notifikasi yang berbeda berdasarkan parameter type:
      • Jika type adalah 'email', kembalikan EmailNotification
      • Jika type adalah 'sms', kembalikan SMSNotification
      • Jika tidak, kembalikan PushNotification
    • Method send() yang mencetak Sending: [message]

Di file yang sama, buat tiga subclass yang mewarisi Notification:

  • EmailNotification: Override send() agar mencetak Email: [message]
  • SMSNotification: Override send() agar mencetak SMS: [message]
  • PushNotification: Override send() agar mencetak Push: [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'
    Panggil send() pada setiap notifikasi sesuai urutan di atas.

Output yang diharapkan:

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

Coba 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
}
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