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 fonksiyonu yerine, her biri birbiriyle ilişkili nesnelerden oluşan tutarlı bir set üreten ve birden fazla somut fabrikanın uyguladığı bir fabrika arayüzü tanımlarsınız.

Düğmeler ve onay kutuları oluşturması gereken bir UI araç setini düşünün. Farklı işletim sistemleri farklı uygulamalar gerektirir, ancak bileşenlerin tutarlı bir şekilde birlikte çalışması gerekir:

type Button interface {
    Render() string
}

type Checkbox interface {
    Check() string
}

// Soyut fabrika arayüzü
type GUIFactory interface {
    CreateButton() Button
    CreateCheckbox() Checkbox
}

Her bir 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ü ile çalışır:

func BuildUI(factory GUIFactory) {
    button := factory.CreateButton()
    checkbox := factory.CreateCheckbox()
    fmt.Println(button.Render(), checkbox.Check())
}

Sisteminizin birbiriyle ilişkili birden fazla ürün ailesiyle çalışması gerektiğinde ve aynı aileden bileşenlerin birlikte kullanıldığından emin olmak istediğinizde Abstract Factory kullanın. Basit bir Factory'den daha karmaşıktır, bu nedenle yalnızca ürün ailelerini yönetmeye gerçekten ihtiyaç duyduğunuzda ona başvurun.

challenge icon

Görev

Kolay

Abstract Factory desenini kullanarak bir mobilya mağazası sistemi inşa edelim! Birbiriyle ilişkili mobilya ürün aileleri üreten fabrikalar oluşturacaksınız; her fabrika tutarlı bir stil (Modern veya Vintage) üreterek aynı fabrikadan çıkan sandalye ve masaların estetik olarak eşleşmesini sağlar.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • furniture.go: Ürün arayüzlerinizi ve somut mobilya türlerinizi tanımlayın.

    İki ürün arayüzü oluşturun:

    • SitOn() string metoduna sahip Chair
    • PlaceItems() string metoduna sahip Table

    İki mobilya ailesi uygulayın:

    • 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üzü ve somut fabrikalarınızı tanımlayın.

    İki metodlu bir FurnitureFactory arayüzü oluşturun:

    • CreateChair() Chair
    • CreateTable() Table

    İki somut fabrika uygulayın:

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

    Ayrıca, stile (modern veya vintage) bağlı olarak uygun fabrikayı döndüren bir GetFactory(style string) FurnitureFactory fonksiyonu oluşturun. Tanınmayan stiller için varsayılan olarak ModernFactory döndürün.

  • main.go: Odaları döşemek için fabrikalarınızı kullanın.

    Fabrikayı kullanarak bir sandalye ve masa oluşturan, ardından her iki eylemi ayrı satırlarda gösteren formatlanmış bir dize döndüren bir FurnishRoom(factory FurnitureFactory) string fonksiyonu oluşturun.

    Bir stil girdisi okuyun, uygun fabrikayı alın, bir odayı döşeyin ve sonucu yazdırın.

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

  • Satır 1: Mobilya stili (modern, vintage veya başka bir şey)

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

modern

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

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

Ve şu girdi verildiğinde:

vintage

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

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

Ve şu girdi verildiğinde:

rustic

Çıktınız şu 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 edin; modern mi yoksa vintage mobilya mı oluşturduğunu bilmez. Bu, bir odadaki tüm mobilyaların aynı aileden gelmesini sağlayarak tutarlı bir stili korur!

Kopya kağıdı

Abstract Factory deseni, somut türlerini belirtmeden ilgili nesne aileleri oluşturur. Birden fazla somut fabrikanın uyguladığı bir fabrika arayüzü tanımlar ve her biri tutarlı bir ilgili nesne kümesi üretir.

Yapı

Her nesne türü için ürün arayüzlerini tanımlayın:

type Button interface {
    Render() string
}

type Checkbox interface {
    Check() string
}

Her ürün türünü oluşturmak için yöntemler bildiren bir soyut fabrika arayüzü oluşturun:

type GUIFactory interface {
    CreateButton() Button
    CreateCheckbox() Checkbox
}

Somut Uygulamalar

Her ailenin tutarlı bir stile veya davranışa sahip olduğu somut ürün ailelerini uygulayın:

// 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

İstemci kodu, somut uygulamalardan bağımsız kalarak fabrika arayüzü ile çalışır:

func BuildUI(factory GUIFactory) {
    button := factory.CreateButton()
    checkbox := factory.CreateCheckbox()
    fmt.Println(button.Render(), checkbox.Check())
}

Ne Zaman Kullanılmalı

Sisteminizin birden fazla ilgili ürün ailesiyle çalışması gerektiğinde ve aynı aileden bileşenlerin birlikte kullanıldığından emin olmak istediğinizde Abstract Factory kullanın. Basit bir Factory'den daha karmaşıktır, bu nedenle yalnızca ürün ailelerini yönetmeye gerçekten ihtiyaç duyduğunuzda kullanın.

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
// - Sandalye ve masa oluşturmak için fabrikayı kullan
// - İlk satırda SitOn() sonucunu ve ikinci satırda PlaceItems() sonucunu içeren bir dize döndür
func FurnishRoom(factory FurnitureFactory) string {
	// TODO: Fabrikayı kullanarak sandalye ve masa oluştur
	// TODO: Her iki eylemi de ayrı satırlarda içeren formatlanmış dizeyi 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