Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Abstract 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:

    • Chair ve SitOn() string metoduyla
    • Table ve PlaceItems() string metoduyla

    İki mobilya ailesi uygula:

    • Modern ailesi: ModernChair, Sitting on a sleek modern chair döndürür ve ModernTable, Placing items on a glass modern table döndürür
    • Vintage ailesi: VintageChair, Sitting on an ornate vintage chair döndürür ve VintageTable, Placing items on a wooden vintage table döndürür
  • factory.go: Soyut fabrika arayüzünü ve somut fabrikaları tanımla.

    İki metoduyla bir FurnitureFactory arayüzü oluştur:

    • CreateChair() Chair
    • CreateTable() Table

    İki somut fabrika uygula:

    • ModernFactory ve ModernChair üreten ModernTable
    • VintageFactory ve VintageChair üreten VintageTable

    Ayrıca, stile (GetFactory(style string) FurnitureFactory veya modern) göre uygun fabrikayı döndüren vintage fonksiyonunu oluştur. Tanınmayan stiller için varsayılan olarak ModernFactory kullan.

  • 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) string fonksiyonunu 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, vintage veya 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 table

Ve şu girdi verildiğinde:

vintage

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

Sitting on an ornate vintage chair
Placing items on a wooden vintage table

Ve şu girdi verildiğinde:

rustic

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

Sitting on a sleek modern chair
Placing items on a glass modern table

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