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.Oncekullanı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ı.