Co to za wzorce projektowe service loacator i singleton development

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:

  1. Service loacator

Najlepiej na przykładzie C# (asp.net mvc)

  1. https://msdn.microsoft.com/en-us/library/ff648968.aspx

  2. https://msdn.microsoft.com/en-us/library/ff650316.aspx

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ą :stuck_out_tongue:

Ok wyjaśniliście mi dobrze o co chodzi z Singletonem, a natomiast co z wzorcem Locator łopatologicznie? :slight_smile:

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.