Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 Converter dengan method Convert(content string) string yang menerima konten dokumen dan mengembalikan output yang sudah dikonversi.

    Implementasikan tiga tipe konverter:

    • PDFConverter: method Convert-nya mengembalikan PDF: [content]
    • HTMLConverter: method Convert-nya mengembalikan HTML: <p>[content]</p>
    • MarkdownConverter: method Convert-nya mengembalikan MD: # [content]

    Buat fungsi factory NewConverter(format string) Converter yang mengembalikan konverter yang sesuai berdasarkan string format (pdf, html, atau markdown). Untuk format yang tidak dikenali, kembalikan PDFConverter sebagai 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 Programming

Output-mu seharusnya:

HTML: <p>Welcome to Go Programming</p>

Dan jika diberikan:

markdown
Chapter One

Output-mu seharusnya:

MD: # Chapter One

Dan jika diberikan:

pdf
Annual Report 2024

Output-mu seharusnya:

PDF: Annual Report 2024

Dan jika diberikan:

docx
Meeting Notes

Output-mu seharusnya:

PDF: Meeting Notes

Perhatikan 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)
}
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