Sobes.tech
Junior

Cu ce modele de proiectare sunteți familiarizat?

sobes.tech AI

Răspuns de la AI

Sunt familiarizat cu diferite modele de proiectare utilizate în Go. Unele dintre cele mai frecvente:

Modele creational:

  • Singleton: Asigură că există doar o instanță a unei clase și oferă un punct de acces global la ea. În Go, este adesea implementat folosind sync.Once.
    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: Definește o interfață pentru crearea unui obiect, dar permite subclasei să decidă ce clasă să instanțieze. În Go, este adesea implementat folosind funcții care returnează interfețe.
    package main
    
    type Product interface {
    	Operate()
    }
    
    type ConcreteProductA struct{}
    
    func (p *ConcreteProductA) Operate() {
    	// Implementarea operației
    }
    
    type ConcreteProductB struct{}
    
    func (p *ConcreteProductB) Operate() {
    	// Implementarea operației
    }
    
    func NewProduct(productType string) Product {
    	switch productType {
    	case "A":
    		return &ConcreteProductA{}
    	case "B":
    		return &ConcreteProductB{}
    	default:
    		return nil // Sau eroare
    	}
    }
    
  • Abstract Factory: Oferă o interfață pentru crearea familiilor de obiecte legate sau dependente fără a specifica clasele lor concrete.
  • Builder: Separă procesul de construire a unui obiect complex de reprezentarea sa.

Modele structurale:

  • Adapter: Convertește interfața unei clase într-una cerută de clienți. Permite colaborarea claselor incompatibile.
  • Decorator: Adaugă responsabilități noi unui obiect în mod dinamic. Decoratorii oferă o alternativă flexibilă la moștenire pentru extinderea funcționalității.
  • Facade: Oferă o interfață unificată pentru un set de interfețe dintr-un subsistem. Definește o interfață de nivel înalt care facilitează utilizarea subsistemului.
  • Proxy: Oferă un înlocuitor sau reprezentant pentru alt obiect pentru a controla accesul la acesta.

Modele comportamentale:

  • Observer: Definește o dependență "unu-la-mulți" între obiecte. Când starea unui obiect se schimbă, toate obiectele dependente sunt notificate și actualizate automat.
  • Strategy: Definește o familie de algoritmi, îi încapsulează pe fiecare și îi face interschimbabili. Permite variația algoritmilor independent de clienții care îi utilizează.
    package main
    
    type Strategy interface {
    	Execute(data string)
    }
    
    type ConcreteStrategyA struct{}
    
    func (s *ConcreteStrategyA) Execute(data string) {
    	// Implementarea strategiei A
    }
    
    type ConcreteStrategyB struct{}
    
    func (s *ConcreteStrategyB) Execute(data string) {
    	// Implementarea strategiei B
    }
    
    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: Definește scheletul unui algoritm într-o operație, lăsând anumite pași subclasei. Permite subclasei să redefinească anumite pași ai unui algoritm fără a-i modifica structura.

Pe lângă modelele menționate, cunosc și modele precum Command, Chain of Responsibility, Iterator, Mediator, Memento, State, Visitor. În Go, se folosesc adesea și idiome de proiectare specifice limbajului, cum ar fi utilizarea interfețelor pentru abstractizare, goroutines și canale pentru paralelism.