Sobes.tech
Middle+

Jakie zadania rozwiązałeś za pomocą wzorców projektowych?

sobes.tech AI

Odpowiedź od AI

Stosował różne wzorce, aby poprawić strukturę i utrzymanie kodu:

Kreacyjne:

  • Singleton: Do tworzenia pojedynczej instancji obiektów, na przykład menedżera konfiguracji lub puli połączeń z bazą danych.
    public final class ConfigManager {
        private static ConfigManager instance;
        private ConfigManager() {} // Prywatny konstruktor
        public static synchronized ConfigManager getInstance() {
            if (instance == null) {
                instance = new ConfigManager();
            }
            return instance;
        }
    }
    
  • Factory Method: Do tworzenia obiektów z określonymi właściwościami bez jawnego wskazywania konkretnych klas. Używany przy pracy z różnymi typami parserów plików.
  • Abstract Factory: Do tworzenia rodzin powiązanych lub zależnych obiektów bez wskazywania ich konkretnych klas. Stosowany przy pracy z różnymi typami źródeł danych (np. system plików, baza danych) i odpowiadającymi im obiektami.

Strukturalne:

  • Adapter: Do dostosowania interfejsu jednej klasy do innego, którego oczekuje klient. Używany do integracji bibliotek zewnętrznych z niekompatybilnymi interfejsami.
    public interface Target {
        void request();
    }
    
    public class Adaptee {
        public void specificRequest() {
            System.out.println("Specyficzne żądanie Adaptee");
        }
    }
    
    public class Adapter implements Target {
        private Adaptee adaptee;
    
        public Adapter(Adaptee adaptee) {
            this.adaptee = adaptee;
        }
    
        @Override
        public void request() {
            adaptee.specificRequest();
        }
    }
    
  • Decorator: Do dynamicznego dodawania nowych obowiązków obiektom bez zmiany ich struktury. Używany do dodawania funkcjonalności logowania lub buforowania do istniejących obiektów.
  • Composite: Do łączenia obiektów w struktury drzewiaste w celu reprezentowania hierarchii "część-całość". Używany przy pracy z elementami interfejsu użytkownika lub strukturą plików.

Behawioralne:

  • Observer: Do definiowania zależności "jeden-do-wielu" między obiektami tak, że gdy zmienia się stan jednego, wszystkie zależne są powiadamiane i automatycznie aktualizowane. Używany do implementacji systemów powiadomień o zdarzeniach.
    import java.util.ArrayList;
    import java.util.List;
    
    public class Subject {
        private List<Observer> observers = new ArrayList<>();
        private int state;
    
        public void attach(Observer observer) {
            observers.add(observer);
        }
    
        public void setState(int state) {
            this.state = state;
            notifyObservers();
        }
    
        private void notifyObservers() {
            for (Observer observer : observers) {
                observer.update();
            }
        }
    }
    
    public interface Observer {
        void update();
    }
    
  • Strategy: Do definiowania rodzin algorytmów, kapsułkując każdy z nich i zapewniając ich wymienność. Używany do wyboru różnych strategii przetwarzania danych w zależności od kontekstu.
  • Template Method: Do definiowania szkieletu algorytmu w operacji, pozostawiając niektóre kroki do zdefiniowania przez podklasy. Używany do standaryzacji procesu obsługi żądań.