Czy ktoś mógłby mi w jasny sposób i najlepiej na przykładzie wytłumaczyć do czego są przydatne i jak się stosuje wzorce projektowe:
- Service loacator
Najlepiej na przykładzie C# (asp.net mvc)
Czy ktoś mógłby mi w jasny sposób i najlepiej na przykładzie wytłumaczyć do czego są przydatne i jak się stosuje wzorce projektowe:
Najlepiej na przykładzie C# (asp.net mvc)
w skrócie możesz utworzyć tylko jedną instancję obiektu danej klasy, taka ucieczka od OOP wprowadzająca zmienne globalne lub rejestr.
Singleton na pewno nie jest ucieczką od OOP :). Singleton gwarantuje, że instancja obiektu zawsze będzie w jednym egzemplarzu.
To tak bardziej w cudzysłowie, ze względu na to że może wprowadzić zmienne globalne - oczywiście też w cudzysłowie bo to nie tak do końca.
public class Singleton
{
public static Singleton Instance {
get
{
return Inner.instance;
}
}
class Inner
{
static Inner(){}
internal static readonly Singleton instance = new Singleton();
}
}
Z Singleton (i nie tylko) jest problem tworzenia obiektów w aplikacjach wielowątkowych. Chodzi o to żeby było dokładnie jedna instancja a przy wielu wątkach może być ona wielokrotnie tworzona jeśli więcej niż jeden wątek w tym samym czasie próbuje stworzyć instancje obiektu.
Dlatego powstało kilka wersji implementacji tego wzorca w C#. Ta powyżej jest przeze mnie używana. Wykorzystuje ‘mały myk’ jakim jest statyczny konstruktor w podklasie, a dokładnie jego wywołanie przy wywołaniu. Nie ma przy tym [jawnych] locków, co sprawia że wszystko działa szybko.
tu więcej info: http://csharpindepth.com/Articles/General/Singleton.aspx
ps: Singleton to OOP pełną gębą
Ok wyjaśniliście mi dobrze o co chodzi z Singletonem, a natomiast co z wzorcem Locator łopatologicznie?
Singleton jak powżej, tylko dodam jeszcze od siebie, że on często jest powiązany ze złą praktyką, czyli pominięciem Dependency Injection. To dlatego, że z dowolnego miejsca w kodzie mogę zrobić MyClass.getInstance(). Powoduje to, że taki komponent jest w praktyce niewymienialny. Stąd Singleton jest uważany za zły wzorzec.