Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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:

    • Chair dengan method SitOn() string
    • Table dengan method PlaceItems() string

    Implementasikan dua keluarga furnitur:

    • Keluarga Modern: ModernChair menghasilkan Sitting on a sleek modern chair dan ModernTable menghasilkan Placing items on a glass modern table
    • Keluarga Vintage: VintageChair menghasilkan Sitting on an ornate vintage chair dan VintageTable menghasilkan Placing items on a wooden vintage table
  • factory.go: Definisikan interface abstract factory dan factory konkretmu.

    Buat interface FurnitureFactory dengan dua method:

    • CreateChair() Chair
    • CreateTable() Table

    Implementasikan dua factory konkret:

    • ModernFactory yang menghasilkan ModernChair dan ModernTable
    • VintageFactory yang menghasilkan VintageChair dan VintageTable

    Buat juga fungsi GetFactory(style string) FurnitureFactory yang mengembalikan factory yang sesuai berdasarkan gaya (modern atau vintage). Gunakan ModernFactory sebagai default untuk gaya yang tidak dikenali.

  • main.go: Gunakan factory-mu untuk melengkapi ruangan dengan furnitur.

    Buat fungsi FurnishRoom(factory FurnitureFactory) string yang 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:

modern

Output-mu harus berupa:

Sitting on a sleek modern chair
Placing items on a glass modern table

Dan jika diberikan:

vintage

Output-mu harus berupa:

Sitting on an ornate vintage chair
Placing items on a wooden vintage table

Dan jika diberikan:

rustic

Output-mu harus berupa:

Sitting on a sleek modern chair
Placing items on a glass modern table

Perhatikan 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
}
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 Go online