Menu
Coddy logo textTech

Factory Kalıbı

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 87 / 107.

Factory deseni, nesne oluşturma işlemini ayrı bir fonksiyona veya metoda devrederek, oluşturma mantığını açığa çıkarmadan örnekler oluşturmanıza olanak tanır. Örnek sayısını kontrol eden Singleton'ın aksine Factory, girdi parametrelerine dayalı esnek nesne oluşturmaya odaklanır.

Go'da bir fabrika (factory), genellikle bir arayüz (interface) türü döndüren ve birleşik bir API aracılığıyla farklı somut türler oluşturmanıza olanak tanıyan bir fonksiyondur:

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{}
    }
}

NewNotifier fabrika fonksiyonu, hangi somut türün oluşturulacağı kararını kapsüller. İstemci kodu, belirli uygulamadan habersiz kalarak yalnızca Notifier arayüzü ile çalışır:

notifier := NewNotifier("sms")
result := notifier.Send("Hello!")  // "SMS: Hello!"

Bu desen; çalışma zamanı koşullarına bağlı olarak nesneler oluşturmanız gerektiğinde, karmaşık başlatma mantığını merkezileştirmek istediğinizde veya istemci kodunu değiştirmeden kolayca yeni türler eklemeniz gerektiğinde öne çıkar. Sadece arayüzü (interface) uygulayan yeni bir struct ekleyin ve fabrika fonksiyonunu (factory function) güncelleyin.

challenge icon

Görev

Kolay

Factory desenini kullanarak bir belge dönüştürücü sistemi inşa edelim! Hedef formata göre farklı belge dönüştürücüler üreten bir fabrika oluşturacaksınız; bu sayede istemci kodu, birleşik bir arayüz aracılığıyla herhangi bir dönüştürücü ile çalışabilecektir.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • converter.go: Dönüştürücü arayüzünüzü ve somut uygulamalarınızı tanımlayın.

    Belge içeriğini alan ve dönüştürülmüş çıktıyı döndüren Convert(content string) string metoduna sahip bir Converter arayüzü oluşturun.

    Üç dönüştürücü türü uygulayın:

    • PDFConverterConvert metodu "PDF: " + content döndürür
    • HTMLConverterConvert metodu "HTML: <p>" + content + "</p>" döndürür
    • MarkdownConverterConvert metodu "MD: # " + content döndürür

    Format dizesine ("pdf", "html" veya "markdown") bağlı olarak uygun dönüştürücüyü döndüren bir NewConverter(format string) Converter fabrika fonksiyonu oluşturun. Tanınmayan herhangi bir format için varsayılan olarak bir PDFConverter döndürün.

  • main.go: Dönüştürücüler oluşturmak ve belgeleri işlemek için fabrikanızı kullanın.

    Bir format türü ve belge içeriği okuyun. Uygun dönüştürücüyü oluşturmak için fabrikayı kullanın, ardından içeriği dönüştürün ve sonucu yazdırın.

Aşağıdaki girdiler sağlanacaktır:

  • Satır 1: Format türü ("pdf", "html", "markdown" veya başka bir şey)
  • Satır 2: Dönüştürülecek belge içeriği

Örneğin, şu girdi verildiğinde:

html
Welcome to Go Programming

Çıktınız şu olmalıdır:

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

Ve şu girdi verildiğinde:

markdown
Chapter One

Çıktınız şu olmalıdır:

MD: # Chapter One

Ve şu girdi verildiğinde:

pdf
Annual Report 2024

Çıktınız şu olmalıdır:

PDF: Annual Report 2024

Ve şu girdi verildiğinde:

docx
Meeting Notes

Çıktınız şu olmalıdır:

PDF: Meeting Notes

Ana kodun belirli dönüştürücü türleri hakkında bilgi sahibi olmasına gerek kalmadığına dikkat edin; sadece fabrikadan bir dönüştürücü ister ve arayüzü kullanır. Bu, istemci kodunu değiştirmeden daha sonra yeni formatlar eklemeyi kolaylaştırır!

Kopya kağıdı

Factory deseni, nesne oluşturma işlemini ayrı bir fonksiyona devreder ve oluşturma mantığını açığa çıkarmadan örnekler oluşturmanıza olanak tanır. Giriş parametrelerine dayalı esnek nesne oluşturmaya odaklanır.

Bir factory fonksiyonu, bir arayüz (interface) türü döndürerek birleşik bir API aracılığıyla farklı somut türlerin oluşturulmasını sağlar:

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{}
    }
}

İstemci kodu yalnızca arayüzle çalışır ve belirli uygulamalardan habersiz kalır:

notifier := NewNotifier("sms")
result := notifier.Send("Hello!")  // "SMS: Hello!"

Bu desen; çalışma zamanı koşullarına göre nesneler oluşturmanız gerektiğinde, karmaşık başlatma mantığını merkezileştirmek istediğinizde veya istemci kodunu değiştirmeden yeni türler eklemeniz gerektiğinde kullanışlıdır.

Kendin dene

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Format türünü oku
	scanner.Scan()
	format := scanner.Text()
	
	// Belge içeriğini oku
	scanner.Scan()
	content := scanner.Text()
	
	// TODO: Uygun dönüştürücüyü oluşturmak için factory'yi kullanın
	// TODO: İçeriği dönüştürün ve sonucu yazdırın
	
	fmt.Println(result)
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler