Wprowadzenie do wzorców projektowych
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 64 z 87.
Wzorce projektowe to sprawdzone rozwiązania typowych problemów, z którymi programiści wielokrotnie się spotykają podczas tworzenia oprogramowania. Zamiast za każdym razem wymyślać koło na nowo, możesz zastosować te sprawdzone szablony, aby rozwiązywać powtarzające się wyzwania projektowe.
Myśl o wzorcach projektowych jak o planach. Nie dają ci gotowego kodu do skopiowania i wklejenia, ale opisują, jak strukturyzować klasy i obiekty, aby rozwiązać określony typ problemu. Wzorce, których się nauczysz, wykorzystują poznane już przez ciebie koncepcje OOP: dziedziczenie, interfejsy, polimorfizm i kompozycję.
Wzorce projektowe dzielą się na trzy główne kategorie:
| Kategoria | Cel | Przykłady |
|---|---|---|
| Kreacyjne | Jak tworzone są obiekty | Singleton, Factory, Builder |
| Strukturalne | Jak komponowane są obiekty | Adapter, Decorator, Composite |
| Behawioralne | Jak komunikują się obiekty | Observer, Strategy, Command |
Po co uczyć się wzorców projektowych? Dają ci wspólny język z innymi programistami: stwierdzenie „użyj tutaj Fabryki” natychmiast przekazuje złożoną ideę. Pomagają też pisać bardziej elastyczny i łatwiejszy w utrzymaniu kod dzięki stosowaniu zasad takich jak „programuj do interfejsu, a nie do implementacji”.
W nadchodzących lekcjach zaimplementujesz kilka podstawowych wzorców, zaczynając od wzorców kreacyjnych, takich jak Singleton i Factory, a następnie przechodząc do wzorców behawioralnych, takich jak Observer i Strategy.
Wyzwanie
ŁatwyZbudujmy prosty klasyfikator wzorców, który pokaże, jak dobrze rozumiesz trzy kategorie wzorców projektowych! Utworzysz system, który klasyfikuje wzorce i wyjaśnia ich przeznaczenie, a kod rozmieścisz w wielu plikach.
Utworzysz trzy pliki:
Pattern.java: Utwórz interfejs o nazwiePattern, który definiuje kontrakt dla wszystkich wzorców projektowych. Interfejs powinien deklarować dwie metody:String getCategory(), która zwraca kategorię wzorca (Creational, Structural lub Behavioral), orazString getPurpose(), która zwraca opis tego, do czego służy dana kategoria wzorców.PatternInfo.java: Utwórz trzy klasy implementujące interfejsPattern, z których każda reprezentuje jedną kategorię wzorców projektowych:CreationalPattern— powinna zwracać"Creational"jako kategorię i"How objects are created"jako przeznaczenie.StructuralPattern— powinna zwracać"Structural"jako kategorię i"How objects are composed"jako przeznaczenie.BehavioralPattern— powinna zwracać"Behavioral"jako kategorię i"How objects communicate"jako przeznaczenie.Main.java: Połącz elementy klasyfikatora wzorców! Otrzymasz jedno wejście: nazwę wzorca (String), która będzie jedną z wartości:"Singleton","Factory","Adapter","Decorator","Observer"lub"Strategy".Na podstawie wejścia utwórz odpowiedni obiekt wzorca:
"Singleton"i"Factory"to wzorce Creational"Adapter"i"Decorator"to wzorce Structural"Observer"i"Strategy"to wzorce Behavioral
Przypisz obiekt wzorca do zmiennej typu
Pattern(interfejsu), demonstrując zasadę programowania do interfejsu. Następnie wyświetl trzy poniższe wiersze:Pattern: [input pattern name]Category: [category from getCategory()]Purpose: [purpose from getPurpose()]
Otrzymasz jedno wejście: nazwę wzorca projektowego (String).
To wyzwanie utrwala kluczową myśl z lekcji: wzorce projektowe są uporządkowane w kategorie na podstawie problemów, które rozwiązują. Korzystając z interfejsu, ćwiczysz również zasadę „programowania do interfejsu, a nie implementacji” — podstawową koncepcję, dzięki której wzorce projektowe są tak potężne!
Spróbuj swoich sił
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String patternName = scanner.nextLine();
// TODO: Zadeklaruj zmienną typu Pattern (interfejsu)
Pattern pattern = null;
// TODO: Na podstawie patternName utwórz odpowiedni obiekt wzorca:
// - "Singleton" i "Factory" to wzorce kreacyjne
// - "Adapter" i "Decorator" to wzorce strukturalne
// - "Observer" i "Strategy" to wzorce behawioralne
// TODO: Wypisz wynik w następującym formacie:
// Pattern: [nazwa wzorca podana na wejściu]
// Category: [kategoria zwrócona przez getCategory()]
// Purpose: [cel zwrócony przez getPurpose()]
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online