Menu
CoddyTech

Pola Factory

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 53 dari 70.

Factory pattern adalah pola kreasi yang mendelegasikan pembuatan object ke method atau class terpisah. Alih-alih menggunakan new secara langsung dalam kodemu, kamu meminta factory membuat object untukmu. Cara ini memusatkan logika pembuatan dan membuat kodemu lebih fleksibel.

Bayangkan sebuah skenario saat kamu perlu membuat berbagai jenis dokumen. Tanpa factory, kodemu menjadi sangat bergantung pada class tertentu:

// Tanpa Factory, logika pembuatan tersebar
IDocument doc;
if (type == "pdf")
    doc = new PdfDocument();
else if (type == "word")
    doc = new WordDocument();

Sebuah factory merangkum pengambilan keputusan ini di satu tempat:

public interface IDocument
{
    void Open();
}
public class PdfDocument : IDocument
{
    public void Open() => Console.WriteLine("Opening PDF");
}
public class WordDocument : IDocument
{
    public void Open() => Console.WriteLine("Opening Word");
}
public class DocumentFactory
{
    public IDocument Create(string type)
    {
        switch (type)
        {
            case "pdf":
                return new PdfDocument();
            case "word":
                return new WordDocument();
            default:
                throw new ArgumentException("Unknown type");
        }
    }
}

Sekarang, kode client cukup meminta yang dibutuhkannya tanpa mengetahui class konkret:

var factory = new DocumentFactory();
IDocument doc = factory.Create("pdf");
doc.Open();  // Membuka PDF

Pola Factory sangat berguna saat kamu perlu menambahkan tipe baru nanti. Untuk menambahkan SpreadsheetDocument, kamu hanya perlu mengubah factory, bukan setiap tempat dokumen dibuat. Pemisahan ini membuat basis kodemu lebih mudah dipelihara dan diuji.

challenge icon

Tantangan

Mudah

Mari buat sistem notifikasi menggunakan pola Factory. Alih-alih membuat berbagai tipe notifikasi secara langsung di seluruh kodemu, kamu akan memusatkan logika pembuatannya dalam class factory yang menentukan notifikasi mana yang akan dibuat berdasarkan pengenal string sederhana.

Kamu akan mengatur kodemu dalam tiga file:

  • Notification.cs: Definisikan interface INotification dalam namespace Notifications dengan satu method Send(string message) yang mengembalikan string. Lalu, buat tiga class yang mengimplementasikan interface ini:
    • EmailNotification - mengembalikan "Email: {message}"
    • SmsNotification - mengembalikan "SMS: {message}"
    • PushNotification - mengembalikan "Push: {message}"
  • NotificationFactory.cs: Buat class NotificationFactory dalam namespace yang sama dengan method Create(string type) yang mengembalikan INotification yang sesuai berdasarkan string tipe:
    • "email" mengembalikan EmailNotification
    • "sms" mengembalikan SmsNotification
    • "push" mengembalikan PushNotification
    Untuk tipe apa pun yang tidak dikenali, kembalikan EmailNotification sebagai nilai default.
  • Program.cs: Satukan semuanya dengan membuat instance factory dan menggunakannya untuk membuat notifikasi berdasarkan input. Factory menangani semua pengambilan keputusan tentang class konkret mana yang akan dibuat.

Kamu akan menerima dua input:

  • Tipe notifikasi (misalnya, sms)
  • Pesan yang akan dikirim (misalnya, Your order has shipped)

Gunakan factory-mu untuk membuat tipe notifikasi yang sesuai, lalu panggil method Send dengan pesan tersebut dan cetak hasilnya.

Contohnya, jika inputnya adalah push dan Meeting in 5 minutes, outputnya adalah:

Push: Meeting in 5 minutes

Perhatikan bahwa kodemu di bagian utama tidak pernah menggunakan new EmailNotification() atau yang serupa. Kode itu hanya meminta factory untuk membuat yang dibutuhkan. Jika nanti kamu menambahkan SlackNotification, kamu hanya perlu memperbarui factory, bukan setiap bagian yang membuat notifikasi!

Coba sendiri

using System;
using Notifications;

class Program
{
    public static void Main(string[] args)
    {
        // Baca input
        string type = Console.ReadLine();
        string message = Console.ReadLine();

        // TODO: Buat instance NotificationFactory

        // TODO: Gunakan factory untuk membuat notifikasi yang sesuai

        // TODO: Panggil method Send dan cetak hasilnya
    }
}
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 C# online