Abstract Factory Kalıbı
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 88 / 107.
Abstract Factory deseni, somut türlerini belirtmeden birbiriyle ilişkili nesne aileleri oluşturarak Factory desenini genişletir. Tek bir fabrika işlevi yerine, birden çok somut fabrikanın uyguladığı ve her birinin birbiriyle tutarlı bir dizi ilişkili nesne ürettiği bir fabrika arayüzü tanımlarsınız.
Düğmeler ve onay kutuları oluşturması gereken bir UI araç seti düşünün. Farklı işletim sistemleri farklı uygulamalar gerektirir, ancak bileşenler tutarlı bir şekilde birlikte çalışmalıdır:
type Button interface {
Render() string
}
type Checkbox interface {
Check() string
}
// Soyut fabrika arayüzü
type GUIFactory interface {
CreateButton() Button
CreateCheckbox() Checkbox
}Her somut fabrika, birbiriyle ilişkili bileşenlerden oluşan bir aile üretir:
// Windows ailesi
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{} }
// Mac ailesi
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{} }İstemci kodu, somut uygulamalardan bağımsız kalarak fabrika arayüzüyle çalışır:
func BuildUI(factory GUIFactory) {
button := factory.CreateButton()
checkbox := factory.CreateCheckbox()
fmt.Println(button.Render(), checkbox.Check())
}Sisteminizin birbiriyle ilişkili birden çok ürün ailesiyle çalışması gerektiğinde ve aynı aileden bileşenlerin birlikte kullanılmasını sağlamak istediğinizde Abstract Factory kullanın. Basit bir Factory'den daha karmaşıktır; bu nedenle yalnızca ürün ailelerini gerçekten yönetmeniz gerektiğinde tercih edin.
Görev
KolayAbstract Factory desenini kullanarak bir mobilya mağazası sistemi oluşturalım! İlişkili mobilya öğelerinden oluşan aileler üreten fabrikalar oluşturacaksın: her fabrika tutarlı bir stil (Modern veya Vintage) üretir ve aynı fabrikadan gelen sandalyeler ile masaların estetik açıdan uyumlu olmasını sağlar.
Kodunu üç dosyaya ayıracaksın:
furniture.go: Ürün arayüzlerini ve somut mobilya türlerini tanımla.İki ürün arayüzü oluştur:
ChairveSitOn() stringmetoduylaTablevePlaceItems() stringmetoduyla
İki mobilya ailesi uygula:
- Modern ailesi:
ModernChair,Sitting on a sleek modern chairdöndürür veModernTable,Placing items on a glass modern tabledöndürür - Vintage ailesi:
VintageChair,Sitting on an ornate vintage chairdöndürür veVintageTable,Placing items on a wooden vintage tabledöndürür
factory.go: Soyut fabrika arayüzünü ve somut fabrikaları tanımla.İki metoduyla bir
FurnitureFactoryarayüzü oluştur:CreateChair() ChairCreateTable() Table
İki somut fabrika uygula:
ModernFactoryveModernChairüretenModernTableVintageFactoryveVintageChairüretenVintageTable
Ayrıca, stile (
GetFactory(style string) FurnitureFactoryveyamodern) göre uygun fabrikayı döndürenvintagefonksiyonunu oluştur. Tanınmayan stiller için varsayılan olarakModernFactorykullan.main.go: Odaları döşemek için fabrikalarını kullan.Fabrikayı kullanarak bir sandalye ve masa oluşturan, ardından her iki işlemi ayrı satırlarda gösteren biçimlendirilmiş bir dize döndüren
FurnishRoom(factory FurnitureFactory) stringfonksiyonunu oluştur.Bir stil girdisi oku, uygun fabrikayı al, bir odayı döşe ve sonucu yazdır.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Mobilya stili (
modern,vintageveya başka bir şey)
Örneğin, şu girdi verildiğinde:
modernÇıktın şu şekilde olmalıdır:
Sitting on a sleek modern chair
Placing items on a glass modern tableVe şu girdi verildiğinde:
vintageÇıktın şu şekilde olmalıdır:
Sitting on an ornate vintage chair
Placing items on a wooden vintage tableVe şu girdi verildiğinde:
rusticÇıktın şu şekilde olmalıdır:
Sitting on a sleek modern chair
Placing items on a glass modern tableFurnishRoom fonksiyonunun arayüz aracılığıyla herhangi bir fabrikayla nasıl çalıştığına dikkat et. Modern veya vintage mobilya oluşturup oluşturmadığını bilmez. Bu, bir odadaki tüm mobilyaların aynı aileden gelmesini ve tutarlı bir stilin korunmasını sağlar!
Kendin dene
package main
import "fmt"
// FurnishRoom mobilya oluşturmak için bir fabrika kullanır ve sonucu döndürür
// TODO: Bu fonksiyonu uygula
// - Fabrikayı bir sandalye ve bir masa oluşturmak için kullan
// - İlk satırda SitOn() sonucunu ve ikinci satırda PlaceItems() sonucunu içeren bir string döndür
func FurnishRoom(factory FurnitureFactory) string {
// TODO: Fabrikayı kullanarak sandalye ve masa oluştur
// TODO: Her iki eylemi ayrı satırlarda içeren biçimlendirilmiş string döndür
return ""
}
func main() {
var style string
fmt.Scanln(&style)
// TODO: Stile göre uygun fabrikayı al
// TODO: Fabrikayı kullanarak bir odayı döşe
// TODO: Sonucu yazdır
}
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