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();
}
}