Junior
Jakie wzorce projektowe znasz?
sobes.tech AI
Odpowiedź od AI
Twórcze:
- Singleton: Zapewnia istnienie tylko jednej instancji klasy i udostępnia globalny punkt dostępu do niej.
- Factory Method: Definiuje interfejs do tworzenia obiektu, ale pozwala podklasom decydować, którą klasę zainstancjonować.
- Abstract Factory: Zapewnia interfejs do tworzenia rodzin powiązanych lub zależnych obiektów, nie precyzując ich konkretnych klas.
- Builder: Dzieli konstruowanie złożonego obiektu na kroki, umożliwiając tworzenie różnych reprezentacji obiektu przy użyciu tego samego procesu konstruowania.
- Prototype: Tworzy obiekty, duplikując istniejący egzemplarz (prototyp), zamiast powtarzać proces konstruowania.
Strukturalne:
- Adapter: Przekształca interfejs jednej klasy w inny interfejs oczekiwany przez klientów. Umożliwia pracę klas z niekompatybilnymi interfejsami.
- Bridge: Oddziela abstrakcję od jej implementacji, pozwalając im zmieniać się niezależnie.
- Composite: Komponuje obiekty w struktury drzewiaste do reprezentacji hierarchii "część-całość". Umożliwia klientom jednolite operacje na pojedynczych obiektach i ich kompozycjach.
- Decorator: Dynamicznie dodaje nowe obowiązki do obiektu, opakowując go w specjalny obiekt-dekorator.
- Facade: Zapewnia zunifikowany interfejs do zestawu interfejsów podsystemu. Definiuje interfejs wyższego poziomu, który upraszcza korzystanie z podsystemu.
- Flyweight: Używa dzielonego stanu między wieloma małymi obiektami, aby zmniejszyć zużycie pamięci i zwiększyć wydajność.
- Proxy: Zapewnia zastępcę obiektu, zarządzającego dostępem do oryginalnego obiektu.
Zachowania:
- Chain of Responsibility: Przekazuje żądanie wzdłuż łańcucha obsługujących. Każdy obsługujący decyduje, czy obsłużyć żądanie, czy przekazać je dalej.
- Command: Inkapsuluje żądanie jako obiekt, umożliwiając parametryzację klientów różnymi żądaniami, umieszczanie żądań w kolejce lub ich logowanie.
- Interpreter: Definiuje składniowe przedstawienie języka i zawiera interpreter do interpretacji zdań w tym języku.
- Iterator: Zapewnia sposób sekwencyjnego dostępu do wszystkich elementów złożonego obiektu, nie ujawniając jego wewnętrznej reprezentacji.
- Mediator: Definiuje obiekty, które zarządzają interakcją między innymi obiektami. Ułatwia słabą spójność, pozwalając obiektom na interakcję bez bezpośredniego odwoływania się do siebie.
- Memento: Umożliwia zapisanie i przywrócenie wewnętrznego stanu obiektu bez naruszania enkapsulacji.
- Observer: Definiuje zależność "jeden do wielu" między obiektami, tak aby przy zmianie stanu jednego obiektu, wszystkie od niego zależne były powiadamiane i automatycznie aktualizowane.
- State: Pozwala obiektowi zmieniać swoje zachowanie w zależności od swojego wewnętrznego stanu. Każdy stan jest enkapsulowany w osobnej klasie.
- Strategy: Definiuje rodzinę algorytmów, enkapsuluje każdy z nich i czyni je wymienialnymi. Umożliwia wybór algorytmu w czasie wykonywania.
- Template Method: Definiuje szkielet algorytmu w operacji, odkładając niektóre kroki na podklasy. Umożliwia podklasom definiowanie kroków algorytmu bez zmiany jego struktury.
- Visitor: Reprezentuje operację, która ma być wykonana na elementach struktury obiektów. Umożliwia definiowanie nowych operacji bez zmiany klas elementów, na których działa.
W rozwoju iOS często spotykane są również:
- Model-View-Controller (MVC): Wzorzec architektoniczny dzielący aplikację na trzy powiązane komponenty: Model (dane i logika biznesowa), Widok (interfejs użytkownika) i Kontroler (łącze między Modelem a Widokiem).
- Delegate: Wzorzec umożliwiający jednemu obiektowi działanie w imieniu lub koordynację działań innego obiektu.
- Observer (NotificationCenter): System rozsyłania powiadomień, umożliwiający obiektom otrzymywanie wiadomości bez bezpośredniego powiązania między sobą.
- Target-Action: Mechanizm używany do wysyłania wiadomości z elementów sterujących (np. przycisków) do docelowego obiektu.
- Coordinator: Wzorzec do zarządzania przepływami nawigacji w aplikacji, oddzielając logikę nawigacji od kontrolerów.
- Dependency Injection: Wzorzec, w którym zależności obiektu są wstrzykiwane z zewnątrz, a nie tworzone przez sam obiekt.
// Przykład Singleton
class SettingsManager {
static let shared = SettingsManager() // Pojedyncza instancja
private init() {
// Prywatny inicjalizator, aby zapobiec tworzeniu na zewnątrz
}
var appVersion: String {
return Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown"
}
}
// Użycie
let settings = SettingsManager.shared
print("Wersja aplikacji: \(settings.appVersion)")
// Przykład Delegate (prosty)
protocol ButtonDelegate: AnyObject {
func buttonWasTapped(_ button: UIButton)
}
class MyButton: UIButton {
weak var delegate: ButtonDelegate? // Właściwość delegate
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
delegate?.buttonWasTapped(self) // Wywołanie metody delegate
}
}
class ViewController: UIViewController, ButtonDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let myButton = MyButton(frame: CGRect(x: 50, y: 50, width: 100, height: 40))
myButton.setTitle("Tap Me", for: .normal)
myButton.backgroundColor = .blue
myButton.delegate = self // Ustawienie delegate
view.addSubview(myButton)
}
func buttonWasTapped(_ button: UIButton) {
print("Przycisk został naciśnięty w ViewController")
}
}