Sobes.tech
Junior

Hangi tasarım kalıplarına aşinasınız?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go'da kullanılan çeşitli tasarım desenleriyle aşinayım. En yaygın olanlardan bazıları:

Yaratımsal desenler:

  • Singleton: Bir sınıfın yalnızca bir örneğinin olmasını sağlar ve ona küresel erişim noktası sağlar. Go'da genellikle sync.Once kullanılarak uygulanır.
    package main
    
    import (
    	"sync"
    )
    
    type singleton struct{}
    
    var instance *singleton
    var once sync.Once
    
    func GetInstance() *singleton {
    	once.Do(func() {
    		instance = &singleton{}
    	})
    	return instance
    }
    
  • Factory Method: Bir nesne oluşturmak için bir arayüz tanımlar, ancak alt sınıfların hangi sınıfın örnekleneceğine karar vermesine izin verir. Go'da genellikle fonksiyonlar kullanılarak uygulanır ve arayüz döndürür.
    package main
    
    type Product interface {
    	Operate()
    }
    
    type ConcreteProductA struct{}
    
    func (p *ConcreteProductA) Operate() {
    	// İşlevin uygulanması
    }
    
    type ConcreteProductB struct{}
    
    func (p *ConcreteProductB) Operate() {
    	// İşlevin uygulanması
    }
    
    func NewProduct(productType string) Product {
    	switch productType {
    	case "A":
    		return &ConcreteProductA{}
    	case "B":
    		return &ConcreteProductB{}
    	default:
    		return nil // veya hata
    	}
    }
    
  • Abstract Factory: İlgili veya bağımlı nesnelerin ailelerini oluşturan arayüz sağlar, ancak onların somut sınıflarını belirtmez.
  • Builder: Karmaşık bir nesnenin yapım sürecini temsil eder ve onu temsil eden ayrıştırmadan ayırır.

Yapısal desenler:

  • Adapter: Bir sınıfın arayüzünü, müşterilerin beklediği başka bir arayüze dönüştürür. Uyuşmayan sınıfların birlikte çalışmasını sağlar.
  • Decorator: Bir nesneye dinamik olarak yeni sorumluluklar ekler. Dekoratörler, işlevselliği genişletmek için kalıtıma esnek bir alternatif sunar.
  • Facade: Bir alt sistemdeki bir dizi arayüze birleşik bir arayüz sağlar. Alt sistemi kullanmayı kolaylaştıran yüksek seviyeli bir arayüz tanımlar.
  • Proxy: Başka bir nesnenin yerine geçen veya onun yerine geçen bir temsilci sağlar, erişimi kontrol eder.

Davranışsal desenler:

  • Observer: Nesneler arasında "birden çoğa" bağımlılık tanımlar. Bir nesnenin durumu değiştiğinde, tüm bağımlı nesneler bildirilir ve otomatik olarak güncellenir.
  • Strategy: Bir algoritma ailesini tanımlar, her birini kapsüller ve bunları değiştirilebilir hale getirir. Algoritmaların bağımsız olarak değişmesine olanak tanır.
    package main
    
    type Strategy interface {
    	Execute(data string)
    }
    
    type ConcreteStrategyA struct{}
    
    func (s *ConcreteStrategyA) Execute(data string) {
    	// Strateji A'nın uygulanması
    }
    
    type ConcreteStrategyB struct{}
    
    func (s *ConcreteStrategyB) Execute(data string) {
    	// Strateji B'nin uygulanması
    }
    
    type Context struct {
    	strategy Strategy
    }
    
    func (c *Context) SetStrategy(strategy Strategy) {
    	c.strategy = strategy
    }
    
    func (c *Context) ExecuteStrategy(data string) {
    	c.strategy.Execute(data)
    }
    
  • Template Method: Bir algoritmanın iskeletini tanımlar, bazı adımları alt sınıflara bırakır. Alt sınıfların, algoritmanın belirli adımlarını yeniden tanımlamasına izin verir, yapısını değiştirmeden.

Ayrıca, Command, Chain of Responsibility, Iterator, Mediator, Memento, State, Visitor gibi desenler hakkında da bilgim var. Go'da ayrıca dil özelliklerine özgü tasarım kalıpları da sıkça kullanılır, örneğin arayüzlerin soyutlama için kullanılması, goroutine'ler ve kanallar ile paralellik sağlanması.