Sobes.tech
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")
    }
}