Pola Abstract Factory
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 88 dari 107.
Pola Abstract Factory mengembangkan pola Factory dengan membuat kelompok object terkait tanpa menentukan tipe konkretnya. Alih-alih menggunakan satu fungsi factory, kamu mendefinisikan antarmuka factory yang diimplementasikan oleh beberapa factory konkret. Masing-masing menghasilkan kumpulan object terkait yang konsisten.
Bayangkan sebuah toolkit UI yang perlu membuat tombol dan kotak centang. Sistem operasi yang berbeda memerlukan implementasi yang berbeda, tetapi komponennya harus tetap bekerja bersama secara konsisten:
type Button interface {
Render() string
}
type Checkbox interface {
Check() string
}
// Antarmuka factory abstrak
type GUIFactory interface {
CreateButton() Button
CreateCheckbox() Checkbox
}Setiap factory konkret menghasilkan sekumpulan komponen yang saling berkaitan:
// Keluarga Windows
type WindowsButton struct{}
func (w WindowsButton) Render() string { return "Windows Button" }
type WindowsCheckbox struct{}
func (w WindowsCheckbox) Check() string { return "Windows Checkbox" }
type WindowsFactory struct{}
func (w WindowsFactory) CreateButton() Button { return WindowsButton{} }
func (w WindowsFactory) CreateCheckbox() Checkbox { return WindowsCheckbox{} }
// Keluarga Mac
type MacButton struct{}
func (m MacButton) Render() string { return "Mac Button" }
type MacCheckbox struct{}
func (m MacCheckbox) Check() string { return "Mac Checkbox" }
type MacFactory struct{}
func (m MacFactory) CreateButton() Button { return MacButton{} }
func (m MacFactory) CreateCheckbox() Checkbox { return MacCheckbox{} }Kode client bekerja dengan antarmuka factory dan tetap independen dari implementasi konkret:
func BuildUI(factory GUIFactory) {
button := factory.CreateButton()
checkbox := factory.CreateCheckbox()
fmt.Println(button.Render(), checkbox.Check())
}Gunakan Abstract Factory saat sistemmu perlu bekerja dengan beberapa keluarga produk yang saling terkait dan kamu ingin memastikan komponen dari keluarga yang sama digunakan bersama. Pola ini lebih kompleks daripada Factory sederhana, jadi gunakan hanya jika kamu memang perlu mengelola keluarga produk.
Tantangan
MudahMari buat sistem toko furnitur menggunakan pola Abstract Factory! Kamu akan membuat factory yang menghasilkan keluarga item furnitur terkait: setiap factory menghasilkan gaya yang konsisten (Modern atau Vintage), sehingga kursi dan tabel dari factory yang sama cocok secara estetis.
Kamu akan mengatur kodemu dalam tiga file:
furniture.go: Definisikan interface produk dan tipe furnitur konkretmu.Buat dua interface produk:
Chairdengan methodSitOn() stringTabledengan methodPlaceItems() string
Implementasikan dua keluarga furnitur:
- Keluarga Modern:
ModernChairmenghasilkanSitting on a sleek modern chairdanModernTablemenghasilkanPlacing items on a glass modern table - Keluarga Vintage:
VintageChairmenghasilkanSitting on an ornate vintage chairdanVintageTablemenghasilkanPlacing items on a wooden vintage table
factory.go: Definisikan interface abstract factory dan factory konkretmu.Buat interface
FurnitureFactorydengan dua method:CreateChair() ChairCreateTable() Table
Implementasikan dua factory konkret:
ModernFactoryyang menghasilkanModernChairdanModernTableVintageFactoryyang menghasilkanVintageChairdanVintageTable
Buat juga fungsi
GetFactory(style string) FurnitureFactoryyang mengembalikan factory yang sesuai berdasarkan gaya (modernatauvintage). GunakanModernFactorysebagai default untuk gaya yang tidak dikenali.main.go: Gunakan factory-mu untuk melengkapi ruangan dengan furnitur.Buat fungsi
FurnishRoom(factory FurnitureFactory) stringyang menggunakan factory untuk membuat kursi dan tabel, lalu mengembalikan string berformat yang menampilkan kedua tindakan pada baris terpisah.Baca input gaya, dapatkan factory yang sesuai, lengkapi ruangan dengan furnitur, lalu cetak hasilnya.
Input berikut akan diberikan:
- Baris 1: Gaya furnitur (
modern,vintage, atau yang lainnya)
Contohnya, jika diberikan:
modernOutput-mu harus berupa:
Sitting on a sleek modern chair
Placing items on a glass modern tableDan jika diberikan:
vintageOutput-mu harus berupa:
Sitting on an ornate vintage chair
Placing items on a wooden vintage tableDan jika diberikan:
rusticOutput-mu harus berupa:
Sitting on a sleek modern chair
Placing items on a glass modern tablePerhatikan bagaimana fungsi FurnishRoom bekerja dengan factory apa pun melalui interface. Fungsi ini tidak mengetahui apakah furnitur yang dibuat bergaya modern atau vintage. Dengan begitu, semua furnitur di sebuah ruangan berasal dari keluarga yang sama dan mempertahankan gaya yang konsisten!
Coba sendiri
package main
import "fmt"
// FurnishRoom menggunakan factory untuk membuat furnitur dan mengembalikan hasilnya
// TODO: Implementasikan fungsi ini
// - Gunakan factory untuk membuat kursi dan tabel
// - Kembalikan string dengan hasil SitOn() pada baris pertama dan hasil PlaceItems() pada baris kedua
func FurnishRoom(factory FurnitureFactory) string {
// TODO: Buat kursi dan tabel menggunakan factory
// TODO: Kembalikan string terformat dengan kedua aksi pada baris terpisah
return ""
}
func main() {
var style string
fmt.Scanln(&style)
// TODO: Dapatkan factory yang sesuai berdasarkan style
// TODO: Lengkapi ruangan dengan furnitur menggunakan factory
// TODO: Cetak hasilnya
}
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