Czym jest wzorzec projektowy?
Wzorzec projektowy jest to typowe rozwiązanie często spotykanego problemu w projektowaniu oprogramowania. Każdy wzorzec posiada plan i założenia jak radzić sobie z konkretnym problemem.
Podział wzorców:
Wzorce dzielą się na:
- kreacyjne
- strukturalne
- behawioralne
Wzorców projektowych jest wiele. Co za tym idzie opisanie każdego zajęłoby wiele czasu, więc pozwoliłem sobie wybrać najpopularniejsze wzorce. Popularność ich wziąłem z rozmaitych wątków na forach internetowych jak i występowanie na różnych blogach.
Pierwszym opisanym przeze mnie wzorcem będzie wzorzec kreacyjny Singleton.
Celem Singletonu jest zapewnienie istnienia tylko jednej instancji. Niestety co za tym idzie łamie zasadę pojedynczej odpowiedzialności.
Zastosowanie Singletonu będzie miało swoje miejsce w np. loggerze gdzie wszystkie logi będą zapisywane w jednym miejscu.
Stwórzmy klasę Logger z konstruktorem prywatnym aby to nie było możliwe stworzenie nowej instancji. W konstruktorze znajduje się linia informująca o stworzeniu konstruktora.
public class Logger
{
static readonly Logger logger = new Logger();
private Logger()
{
Console.WriteLine("logger called");
}
public static Logger getLogger()
{
return logger;
}
}
Wywołując metodę getLogger zawsze zostanie zwrócony ten sam obiekt logger bez względu na to w której klasie go wywołamy.
Następny wybrany przeze mnie wzorzec kreacyjny to Fabryka (ang. Factory).
Fabryka pozwala tworzyć rodziny spokrewnionych ze sobą obiektów bez określania ich konkretnych klas. Implementacja tego wzorca polega na określeniu interfejsów dla produktu z jakiejś rodziny oraz implementacje tych interfejsów przez produkty.
Najprostszym przykładem będzie zastosowanie tego wzorca w klasie z informacjami o użytkowniku oraz poszczególnych klasach takich jak pracownik czy klient które posiadają dziedziczenie z klasy z informacjami.
Takie rozwiązanie posiada wiele zalet między innymi masz pewność, że produkty które otrzymałeś są ze sobą kompatybilne, spełniona jest zasada pojedynczej odpowiedzialności oraz zasada otwarte/zamknięte. Niestety może to spowodować, że kod stanie siębardziej skomplikowany niż powinien.
Ostatnim juz wybranym przeze mnie wzorcem bedzie Obserwator (ang. Observer). Jest to behawioralny wzorzec pozwalający zdefiniować mechanizm subskrybcji w celu informowania wielu obiektów o zdarzeniach dziejących się w obserwowanym świecie. Czesto się go stosuje np. przy pracy z GUI. Przykładem mogą być przyciski, które to odpowiednio reagują przez wcześniej wgrany kod użytkownika.
Zaletą takiego wzorca jest przede wszystkim spełnienie zasady otwarte/zamknięte, ponieważ do programu można wprowadzać nowe klasy subskrybujące bez konieczności zmieniania kodu publikującego.
Po więcej informacji oraz bardziej szczegółowy opis wzorców możesz znaleźć na rafactoring.guru