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.
Görev
KolayFactory 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
Convertermetoduna sahip birConvert(content string) stringarayüzü oluştur.Üç dönüştürücü türü uygula:
PDFConverter:ConvertmetoduPDF: [content]döndürürHTMLConverter:ConvertmetoduHTML: <p>[content]</p>döndürürMarkdownConverter:ConvertmetoduMD: # [content]döndürür
Biçim dizesine (
NewConverter(format string) Converter,pdfveyahtml) göre uygun dönüştürücüyü döndüren birmarkdownfabrika işlevi oluştur. Tanınmayan herhangi bir biçim için varsayılan olarak birPDFConverterdö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,markdownveya 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 NotesAna 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)
}
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
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker PoolKendi başına pratik yap: Online Go derleyicisi