Sobes.tech
Middle

Jakie wzorce projektowe, oprócz Singleton, używałeś?

sobes.tech AI

Odpowiedź od AI

  • Metoda Fabryki. Używana do tworzenia obiektów bez jawnego określenia konkretnego typu klasy. Przydatne, gdy logika tworzenia obiektu zależy od podklas.
  • Fabryka Abstrakcyjna. Stosowana do tworzenia rodzin powiązanych lub zależnych obiektów, zapewniając interfejs do tego, ale nie wskazując konkretnych klas.
  • Builder. Używany do krokowego tworzenia złożonych obiektów, gdzie kolejność i kombinacja kroków mogą się różnić. Pozwala uniknąć "konstruktora teleskopowego".
  • Obserwator. Implementowany do tworzenia zależności "jeden do wielu" między obiektami, gdzie zmiana stanu jednego obiektu automatycznie powiadamia wszystkie zależne obiekty.
  • Strategia. Stosowana do definiowania rodziny algorytmów, enkapsulacji każdego z nich i zapewnienia ich wymienialności. Umożliwia wybór algorytmu podczas działania programu.
  • Dekorator. Używany do dynamicznego dodawania nowych obowiązków obiektom bez zmiany ich struktury.
  • Proxy. Stosowany w przypadkach, gdy trzeba kontrolować dostęp do obiektu, np. dla leniwej ładowania lub zdalnego dostępu.
  • Metoda Szablonowa. Używana do określenia szkieletu algorytmu w klasie bazowej, umożliwiając podklasom nadpisanie określonych kroków bez zmiany głównej struktury.
  • Adapter. Stosowany do przekształcania interfejsu jednej klasy w interfejs oczekiwany przez klientów. Umożliwia współpracę klas z niekompatybilnymi interfejsami.
  • Polecenie. Używane do enkapsulacji żądania w postaci obiektu, co pozwala na parametryzację klientów różnymi żądaniami, umieszczanie żądań w kolejce lub prowadzenie logu operacji, a także obsługę cofania operacji.

Przykład implementacji metody fabrycznej:

// Interfejs produktu
interface Product {
    void doSomething();
}

// Konkrete produkty
class ConcreteProductA implements Product {
    @Override
    public void doSomething() {
        System.out.println("Robi coś w Produkcie A");
    }
}

class ConcreteProductB implements Product {
    @Override
    public void doSomething() {
        System.out.println("Robi coś w Produkcie B");
    }
}

// Interfejs twórcy
abstract class Creator {
    public abstract Product factoryMethod();

    public void someOperation() {
        Product product = factoryMethod();
        product.doSomething();
    }
}

// Konkrete twórcy
class ConcreteCreatorA extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

class ConcreteCreatorB extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}