Junior
Quali pattern di progettazione conosci?
sobes.tech AI
Risposta dell'AI
Creazionali:
- Singleton: Garantisce che esista una sola istanza di una classe e fornisce un punto di accesso globale ad essa.
- Factory Method: Definisce un'interfaccia per creare un oggetto, ma permette alle sottoclassi di decidere quale classe istanziare.
- Abstract Factory: Fornisce un'interfaccia per creare famiglie di oggetti correlati o dipendenti senza specificarne le classi concrete.
- Builder: Divide la costruzione di un oggetto complesso in passaggi, consentendo di creare diverse rappresentazioni dell'oggetto usando lo stesso processo di costruzione.
- Prototype: Crea oggetti duplicando un'istanza esistente (prototipo), invece di eseguire nuovamente il processo di costruzione.
Strutturali:
- Adapter: Converte l'interfaccia di una classe in un'altra interfaccia che i clienti si aspettano. Permette a classi con interfacce incompatibili di lavorare insieme.
- Bridge: Separa l'astrazione dalla sua implementazione, consentendo a entrambe di variare indipendentemente.
- Composite: Componi oggetti in strutture ad albero per rappresentare gerarchie parte-tutto. Permette ai clienti di trattare in modo uniforme oggetti singoli e composizioni di oggetti.
- Decorator: Aggiunge responsabilità aggiuntive a un oggetto in modo dinamico avvolgendolo in un oggetto decoratore.
- Facade: Fornisce un'interfaccia unificata a un insieme di interfacce di un sottosistema. Definisce un'interfaccia di livello superiore che semplifica l'uso del sottosistema.
- Flyweight: Utilizza lo stato condiviso tra molte piccole istanze per ridurre l'uso di memoria e migliorare le prestazioni.
- Proxy: Fornisce un rappresentante o sostituto di un altro oggetto che controlla l'accesso ad esso.
Comportamentali:
- Chain of Responsibility: Trasmette la richiesta lungo una catena di gestori. Ogni gestore decide se elaborare la richiesta o passarla al successivo.
- Command: Incapsula una richiesta come oggetto, consentendo di parametrizzare clienti con richieste diverse, mettere in coda richieste o registrare le loro esecuzioni.
- Interpreter: Definisce la grammatica di un linguaggio e fornisce un interprete per interpretare le espressioni in quel linguaggio.
- Iterator: Fornisce un metodo per accedere sequenzialmente a tutti gli elementi di una collezione senza rivelare la sua rappresentazione interna.
- Mediator: Definisce oggetti che controllano l'interazione tra un insieme di oggetti. Favorisce un basso accoppiamento facendo interagire gli oggetti tramite un mediatore.
- Memento: Permette di salvare e ripristinare lo stato interno di un oggetto senza violare la sua incapsulamento.
- Observer: Definisce una dipendenza uno-a-molti tra oggetti, in modo che quando uno cambia stato, tutti i suoi dipendenti siano notificati e aggiornati automaticamente.
- State: Permette a un oggetto di cambiare comportamento quando il suo stato interno cambia. L'oggetto sembrerà cambiare classe.
- Strategy: Definisce una famiglia di algoritmi, li incapsula e li rende intercambiabili. Permette di scegliere l'algoritmo durante l'esecuzione.
- Template Method: Definisce la struttura di un algoritmo in un'operazione, lasciando alcuni passi alle sottoclassi. Permette alle sottoclassi di ridefinire alcuni passi dell'algoritmo senza cambiarne la struttura.
- Visitor: Rappresenta un'operazione che deve essere eseguita sugli elementi di una struttura di oggetti. Permette di definire nuove operazioni senza modificare le classi degli elementi su cui agisce.
Nello sviluppo iOS si incontrano anche frequentemente:
- Model-View-Controller (MVC): Pattern architetturale che divide l'applicazione in tre componenti correlate: Modello (dati e logica di business), Vista (interfaccia utente) e Controller (collegamento tra Modello e Vista).
- Delegate: Pattern che permette a un oggetto di agire per conto o di coordinare le azioni di un altro oggetto.
- Observer (NotificationCenter): Sistema di distribuzione di notifiche che permette agli oggetti di ricevere messaggi senza una relazione diretta tra loro.
- Target-Action: Meccanismo usato per inviare messaggi dagli elementi di controllo (ad esempio, pulsanti) a un oggetto destinazione.
- Coordinator: Pattern per gestire i flussi di navigazione in un'applicazione, separando la logica di navigazione dai controller.
- Dependency Injection: Pattern in cui le dipendenze di un oggetto vengono iniettate dall'esterno invece di essere create dall'oggetto stesso.
// Esempio Singleton
class SettingsManager {
static let shared = SettingsManager() // Istanza singola
private init() {
// Inizializzatore privato per impedire creazioni esterne
}
var appVersion: String {
return Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Sconosciuto"
}
}
// Uso
let settings = SettingsManager.shared
print("Versione dell'app: \(settings.appVersion)")
// Esempio Delegate (semplice)
protocol ButtonDelegate: AnyObject {
func buttonWasTapped(_ button: UIButton)
}
class MyButton: UIButton {
weak var delegate: ButtonDelegate? // Proprietà delegato
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
delegate?.buttonWasTapped(self) // Chiamata al metodo del delegato
}
}
class ViewController: UIViewController, ButtonDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let myButton = MyButton(frame: CGRect(x: 50, y: 50, width: 100, height: 40))
myButton.setTitle("Tocca me", for: .normal)
myButton.backgroundColor = .blue
myButton.delegate = self // Imposta delegato
view.addSubview(myButton)
}
func buttonWasTapped(_ button: UIButton) {
print("Il pulsante è stato toccato nel ViewController")
}
}