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 PDFPola 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.
Tantangan
MudahMari 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 interfaceINotificationdalam namespaceNotificationsdengan satu methodSend(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 classNotificationFactorydalam namespace yang sama dengan methodCreate(string type)yang mengembalikanINotificationyang sesuai berdasarkan string tipe:"email"mengembalikanEmailNotification"sms"mengembalikanSmsNotification"push"mengembalikanPushNotification
EmailNotificationsebagai 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 minutesPerhatikan 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
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list10Pola Desain Bagian 1
Pengantar Pola DesainSingleton yang Aman untuk ThreadPola FactoryPola Observer (Peristiwa)Pola Strategy2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositeLatihan sendiri: Compiler C# online