Pola Factory
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 87 dari 107.
Factory pattern mendelegasikan pembuatan object ke fungsi atau method terpisah, sehingga kamu dapat membuat instance tanpa mengekspos logika pembuatannya. Berbeda dengan Singleton yang mengontrol jumlah instance, Factory berfokus pada pembuatan object yang fleksibel berdasarkan parameter input.
Di Go, factory biasanya berupa fungsi yang mengembalikan tipe interface, sehingga kamu dapat membuat berbagai tipe konkret melalui API terpadu:
type Notifier interface {
Send(message string) string
}
type EmailNotifier struct{}
type SMSNotifier struct{}
func (e EmailNotifier) Send(message string) string {
return "Email: " + message
}
func (s SMSNotifier) Send(message string) string {
return "SMS: " + message
}
func NewNotifier(notifierType string) Notifier {
switch notifierType {
case "email":
return EmailNotifier{}
case "sms":
return SMSNotifier{}
default:
return EmailNotifier{}
}
}Fungsi factory NewNotifier merangkum keputusan tentang tipe konkret yang akan dibuat. Kode client hanya bekerja dengan interface Notifier, tanpa mengetahui implementasi spesifiknya:
notifier := NewNotifier("sms")
result := notifier.Send("Hello!") // "SMS: Hello!"Pola ini sangat berguna saat kamu perlu membuat object berdasarkan kondisi saat runtime, ingin memusatkan logika inisialisasi yang kompleks, atau perlu menambahkan tipe baru dengan mudah tanpa mengubah kode client. Cukup tambahkan struct baru yang mengimplementasikan interface, lalu perbarui fungsi factory.
Tantangan
MudahMari buat sistem konverter dokumen menggunakan pola Factory! Kamu akan membuat factory yang menghasilkan berbagai konverter dokumen berdasarkan format tujuan, sehingga kode klien dapat menggunakan konverter apa pun melalui antarmuka terpadu.
Kamu akan mengatur kodemu di dua file:
converter.go: Definisikan antarmuka konverter dan implementasi konkretnya.Buat antarmuka
Converterdengan methodConvert(content string) stringyang menerima konten dokumen dan mengembalikan output yang sudah dikonversi.Implementasikan tiga tipe konverter:
PDFConverter: methodConvert-nya mengembalikanPDF: [content]HTMLConverter: methodConvert-nya mengembalikanHTML: <p>[content]</p>MarkdownConverter: methodConvert-nya mengembalikanMD: # [content]
Buat fungsi factory
NewConverter(format string) Converteryang mengembalikan konverter yang sesuai berdasarkan string format (pdf,html, ataumarkdown). Untuk format yang tidak dikenali, kembalikanPDFConvertersebagai default.main.go: Gunakan factory-mu untuk membuat konverter dan memproses dokumen.Baca tipe format dan konten dokumen. Gunakan factory untuk membuat konverter yang sesuai, lalu konversikan kontennya dan cetak hasilnya.
Input berikut akan diberikan:
- Baris 1: Tipe format (
pdf,html,markdown, atau format lainnya) - Baris 2: Konten dokumen yang akan dikonversi
Contohnya, jika diberikan:
html
Welcome to Go ProgrammingOutput-mu seharusnya:
HTML: <p>Welcome to Go Programming</p>Dan jika diberikan:
markdown
Chapter OneOutput-mu seharusnya:
MD: # Chapter OneDan jika diberikan:
pdf
Annual Report 2024Output-mu seharusnya:
PDF: Annual Report 2024Dan jika diberikan:
docx
Meeting NotesOutput-mu seharusnya:
PDF: Meeting NotesPerhatikan bahwa kode utama tidak perlu mengetahui tipe konverter yang spesifik. Kode tersebut hanya meminta konverter dari factory dan menggunakan antarmukanya. Dengan begitu, kamu dapat menambahkan format baru dengan mudah nanti tanpa mengubah kode klien!
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Baca tipe format
scanner.Scan()
format := scanner.Text()
// Baca isi dokumen
scanner.Scan()
content := scanner.Text()
// TODO: Gunakan factory untuk membuat converter yang sesuai
// TODO: Konversi isi dokumen dan cetak hasilnya
fmt.Println(result)
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik13Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola Abstract FactoryPola ObserverPola Strategy2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online