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 işlev veya metoda devreder; böylece oluşturma mantığını açığa çıkarmadan örnekler oluşturmanızı sağlar. Örnek sayısını kontrol eden Singleton’ın aksine Factory, girdi parametrelerine dayalı esnek nesne oluşturmaya odaklanır.

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

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

Fabrika işlevi NewNotifier, hangi somut türün oluşturulacağına ilişkin kararı kapsüller. İstemci kodu yalnızca Notifier arayüzüyle çalışır ve belirli uygulamanın ayrıntılarından 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 kolayca yeni türler eklemeniz gerektiğinde öne çıkar. Arayüzü uygulayan yeni bir yapı eklemeniz ve fabrika işlevini güncellemeniz yeterlidir.

challenge icon

Görev

Kolay

Factory kalıbını kullanarak bir belge dönüştürme sistemi oluşturalım! Hedef biçime göre farklı belge dönüştürücüleri üreten bir fabrika oluşturacak ve istemci kodunun birleşik bir arayüz aracılığıyla herhangi bir dönüştürücüyle çalışmasını sağlayacaksın.

Kodunu iki dosyada düzenleyeceksin:

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

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

    Üç dönüştürücü türü uygula:

    • PDFConverter: Convert metodu PDF: [content] döndürür
    • HTMLConverter: Convert metodu HTML: <p>[content]</p> döndürür
    • MarkdownConverter: Convert metodu MD: # [content] döndürür

    Biçim dizesine (NewConverter(format string) Converter, pdf veya html) göre uygun dönüştürücüyü döndüren bir markdown fabrika işlevi oluştur. Tanınmayan herhangi bir biçim için varsayılan olarak bir PDFConverter döndür.

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

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

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

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

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

html
Welcome to Go Programming

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

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

Şu giriş verildiğinde:

markdown
Chapter One

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

MD: # Chapter One

Şu giriş verildiğinde:

pdf
Annual Report 2024

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

PDF: Annual Report 2024

Şu giriş verildiğinde:

docx
Meeting Notes

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

PDF: Meeting Notes

Ana kodun belirli dönüştürücü türleri hakkında bilgi sahibi olmak zorunda olmadığına dikkat et. Yalnızca fabrikadan bir dönüştürücü ister ve arayüzü kullanır. Bu, istemci kodunu değiştirmeden daha sonra yeni biçimler eklemeyi kolaylaştırı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
	// TODO: İçeriği dönüştür ve sonucu yazdır
	
	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

Kendi başına pratik yap: Online Go derleyicisi