3 najpopularniejsze wzorce

3 najpopularniejsze wzorce projektowe

W tym artykule opiszę 3 najpopularniejsze wzorce projektowe, które moim zdaniem powinien znać każdy programista. Nie ważne czy dopiero zaczynasz, czy masz już kilka lat doświadczenia. Znajomość tych wzorców to podstawa. Wzorce pomagają uporządkować twój kod i sprawiają, że nie musisz wynajdować koła na nowo rozwiązując znane już problemy.

Wzorce projektowe – wprowadzenie

Z pośród całego katalogu wzorców projektowych wybranie najpopularniejszych wcale nie jest takie proste. Istnieje bardzo wiele wzorców. W książce Design Patterns:
Elements of Reusable Object-Oriented Software zwanej potocznie książką GoF (Gang of Four – nazwa pochodzi od ilości autorów) jest ich aż 23, a to oczywiście nie wszystkie wzorce.

Prawdopodobnie można by wydzielić jeszcze drugie tyle. Dodatkowo mamy też różne wzorce architektury. Co sprawia, że ileość wzorców jaką musi poznać przeciętny programista jest bardzo duża.

Ale nie wszystkie wzorce są używane często większość z nich jest wręcz używana sporadycznie. Poniżej opisałem te, które moim zadaniem są używane najczęściej we współczesnych aplikacjach.

 

Budowniczy (Builder)

Najpopularniejszym wzorcem moim zdaniem jest builder. Jest on wzorcem kreacyjnym, który pozwala oddzielić proces tworzenia obiektu od jego reprezentacji. Można go spotkać naprawdę w wielu miejscach. Najczęściej jest używany do tworzenia obiektów DTO. Jest on też nieodłącznym elementem obiektów niezmiennych (immutable), o których pisałem w Pytania rekrutacyjne Java – Obiekty niezmienne (immutable). Można go stosować w zasadzie do dowolnego rodzaju obiektów. Builder jest jednym z prostszych wzorców do zastosowania, czy zrozumienia. Można go zaimplementować na wiele sposobów. Można także użyć różnych narzędzi do generowania takiego buildera np. pluginy do środowiska programistycznego.

Kolejnym narzędziem jakiego możemy użyć do generowania buildera jest Lombok (pisałem o nim w Lombok dobre i słabe strony). W Lomboku wystarczy dodać do klasy adnotację @Builder, żeby Lombok wygenerował takiego buildera.

Poniżej mamy przykład implementacji buildera jako wewnętrznej klasy statycznej.

public class Person {
  private String name;
  private int age;
 
  public static Builder builder() {
    return new Builder();
  }
 
  public static class Builder {
    private Person person = new Person();
 
    public Builder name(String name) {
      person.name = name;
      return this;
    }
 
    public Builder age(int age) {
      person.age = age;
      return this;
    }
 
    public Person build() {
      return person;
    }
  }
  // ... getters ...
}

Poza prostym wypełnianiem pól w obiektach typu POJO (Plain Old Java Object) metody buildera mogą zawierać dodatkową logikę. np. walidację (wszystkie zalety buildera zostały opisane w Effective Java – Item 2)

 

Fabryka (Factory)

Wzorzec ten można spotkać pod dwiema postaciami fabryka abstrakcyjna (abstract factory) i metoda wytwórcza (factory method). W obu przypadkach koncepcja jest taka sama, różnica polega na tym, że w pierwszym przypadku dzięki abstrakcji możemy wytworzyć obiekt dowolnego typu. Natomiast w drugim tworzymy zwykle obiekt konkretnego typu.

 

public class CarFactory {

    public Cat createCarWithDieselEngine(float capacity) {
        return new Car(new DieselEngine(capacity)); 
    }

    public Cat createCarWithPetrolEngine(float capacity) {
        return new Car(new PetrolEngine(capacity)); 
    }
}

Użycie:

CarFactory factory = new CarFactory();
Car carWithDiesel = factory = factory.createCarWithDieselEngine(2.0);

 

Różnica między factory a builderem

Fabryka służy do tworzenia całej „rodziny obiektów”. Builder zaś tworzy pojedynczy obiekt. Możemy, więc użyć builderów do tworzenia obiektów wewnątrz fabryki. Często też stosowanym wariantem metody wytwórczej jest statyczna metoda wytwórcza używana zamiast konstruktora (wszystkie zalety tej konstrukcji zostały opisane w Effective Java – Item 1).

 

Singleton

Kolejny bardzo popularny wzorzec to singleton. Służy on do zapewnienia, że dany obiekt zostanie stworzony tylko raz. Ma to na celu ograniczenie ilości obiektów tworzonych w aplikacji. Często Singleton określany jest anty wzorcem ponieważ łamie on zasady programowania obiektowego (wprowadza globalny stan). A także może znacząco utrudnić testowanie.

 

public final class SingletonExample {

  private static SingletonExample INSTANCE;

  private SingletonExample() {        
  }

  public static SingletonExample getInstance() {
    if(INSTANCE == null) {
      INSTANCE = new SingletonExample();
    }
    return INSTANCE;
  }

  // pozostały kod
}

Użycie

SingletonExample singleton = SingletonExample.getInstance();
singleton.doSomething();

 

W inny sposób można zaimplementować singleton korzystając z enuma wtedy to JVM zapewnia nam unikalność tworzonego obiektu (więcej możesz przeczytać w Effective Java – Item 3).

public enum EnumSingleton {

  INSTANCE;

  public EnumSingleton getInstance() {
    return INSTANCE;
  }

  // pozostały kod
}

 

Mimo, że singleton może sprawiać nam pewne problemy w związku z wadami, o których wspomniałem. To czasem możemy chcieć go zastosować w celu optymalizacji naszej aplikacji. Gdy np. mamy dużo długo żyjących obiektów, których inicjalizacja jest dosyć kosztowna.

Kolejnym przykładem singletonów są beany springowe. Spring Framework tworzy domyślnie beany jako singletony (każdy bean ma tylko jedną instancję). Pomaga to zoptymalizować tworzenie obiektów beanów. Beany tworzone są tylko przy starcie aplikacji. Dzięki czemu Garbage Collector ma dużo mniej pracy.

 

Podsumowanie

To tylko trzy najpopularniejsze moim zdaniem wzorce projektowe. Warto zapoznać się jeszcze z takimi wzorcami jak: Adapter, Fasada, czy Strategia. Pomogą Ci one zrozumieć jak twój kod może wyglądać lepiej, czy jaką mógłby mieć strukturę.

 

Mateusz Dąbrowski

Cześć jestem Mateusz, zajmuję się programowaniem już ponad 12 lat z czego ponad 8 programuję w Javie. Zapraszam Cię do lektury mojego bloga. Możesz przeczytać więcej o mnie >>TUTAJ<<

8 thoughts to “3 najpopularniejsze wzorce projektowe”

  1. Na pewno będę częściej tutaj wpadał. Ciekawe artykuły do poczytania 🙂

  2. SIngleton jako najpopularniejszy wzorzec projektowy?
    Chyba na rozmowie rekrutacyjnej 😀
    Warto było umieścić coś innego.

    1. To zależy, jak do tego podchodzisz 😉 Może korzystasz z singletonów i nawet o tym nie wiesz 😉

      1. Hmm singleton jest zapewne szeroko stosowany w wielu frameworkach, np w Springu jako zakres Beanów. To tak, wtedy można powiedzieć że uważam go pośrednio 😀 Ale samemu komercyjnie jeszcze nie zdażyło mi się go na napisać 🙂

        1. Jasne, rozumiem 😉 Mi zdarzało się go czasem pisać, więc dlatego jest w tym zestawieniu 😉 Są też inne wzorce, których często używam, ale wiem, że nie są zbyt popularne, dlatego ich tutaj nie dawałem. Napisz może, jakich Ty najczęściej używasz, zawsze warto wiedzieć czego używają inni.

Komentarze są zamknięte.