Wzorce projektowe w C# – Intro.

W ostatnim czasie zgłębiam tajniki wzorców projektowych wspomagając się tą oto pozycją książkową:

designpatternsbook.jpg

Książka w przemawiający do mnie sposób opisuję implementację dość dużej liczby wzorców projektowych opierając się na nowej wersji języka C#. Rozdziały kończą się ćwiczeniami sprawdzającymi poziom zrozumienia kolejnych wzorców. Niebawem spróbuje zaprezentować własną implementację niektórych ćwiczeń – wcześniej jednak na dobry początek przykład wzorca projektowego „Singleton” w połączeniu z wzorcem projektowym „Facade”.

Utworzyłem dwa Systemy których funkcjonalność jest udostępniania przez klasę Facade.

Klasa SystemA:

internal class SystemA
    {
        internal void OperationA()
        {
            Console.WriteLine("Operacja SystemA.");
        }
    }

Klasa SystemB:

internal class SystemB
    {
        internal void OperationB()
        {
            Console.WriteLine("Operacja SystemB.");
        }
    }

Klasa Facade:

/// <summary>
    /// Wzorzec projektowy Singleton
    /// Klasa bedaca jednoczesnie reprezentacja
    /// wzorca projektowego Facade
    /// udostepnia operacja poszczegolnych systemow
    /// </summary>
    public sealed class Facade
    {
        /// <summary>
        /// Obiekt pierwszego systemu
        /// </summary>
        private SystemA _systemA;
        /// <summary>
        /// Obiekt drugiego systemu
        /// </summary>
        private SystemB _systemB;

        /// <summary>
        /// Prywatny konstruktor
        /// </summary>
        private Facade()
        {
            //Utworzenie obiektow
            _systemA = new SystemA();
            _systemB = new SystemB();
        }

        /// <summary>
        /// Zmienna statczyna klasy Facade
        /// Jest utworzona w pierwszej kolejnosci
        /// </summary>
        private static readonly Facade _uniqueInstance = new Facade();

        /// <summary>
        /// Wlasciwosc zwracajaca unikalna instancje klasy
        /// </summary>
        public static Facade UniqueInstance
        {
            get
            {
                return _uniqueInstance;
            }
        }

        /// <summary>
        /// Operacja wykonywana przez jeden z Systemow
        /// SystemA
        /// </summary>
        public void Operation1()
        {
            _systemA.OperationA();
        }

        /// <summary>
        /// Operacja wykonywana przez jeden z Systemow
        /// SystemB
        /// </summary>
        public void Operation2()
        {
            _systemB.OperationB();
        }
    }

Tak oto wygląda wykorzystanie powyższej funkcjonalności:

//Utworzenie fasady systemow
Facade facade = Facade.UniqueInstance;
//Uruchomienie funkcjonalnosci
facade.Operation1();
facade.Operation2();

I to było by na tyle, kończę małą dawką humoru: „Każdego eksperta da się zastąpić skończoną liczbą studentów.” ;)

  1. Singleton jest bardzo niebezpieczny i czesto naduzywany. Mialem kolege w pracy, ktory dowiedzial sie o singletonie i potrafil 80% programu w nim zamknac :)

  2. Tak zdecydowanie wzorzec projektowy którego należy używać z głową. :)

  3. to wielce nie odpowiedzialna wersja singeltona, nie wiem jak ktoś to mógł umieścić jako wzorzec… chyba, że mowa o aplikacjach w których do instancji tego obiektu nie będzie wielu odwołań z innych wątków :) wtedy zwracam honor, a w innym wypadku proponuje takie cos…

    public static Singleton Instance() {
    if (_instance == null) {
    lock (typeof(Singleton)) {
    if (_instance == null) {
    _instance = new Singleton();
    }
    }
    }
    return _instance;
    }
    protected Singleton() {}
    private static volatile Singleton _instance = null;

    sprawdza się w aplikacjach wielowątkowych, czasami nawet warto zamiast lock użyć monitor

  4. Zgadzam się z Tobą i jeśli będę prezentował jeszcze coś w czym wykorzystam wzorzec Singleton będzie to właśnie wyglądało tak jak tutaj podałeś. ;)

    • gordon_shumway
    • 5 marca 2009

    @Si3Ma: chyba nie masz do końca racji. Kod przedstawiony przez autora bloga jest zbieżny z implementacjami singletona, jakie udało mi się znaleźć w Internecie. Sam również używam w podobny sposób tego wzorca. Tu linki, które traktują o problemie:

    http://www.yoda.arachsys.com/csharp/singleton.html
    http://en.csharp-online.net/Singleton_design_pattern:_Thread-safe_Singleton

    Oczywiście, wersja przedstawiona przez Ciebie nie jest błędna, ale nie jest jedyną możliwą, prawidłową wersją.

  5. To tylko jeden z przykładów Singletona tak jak napisałeś Gordon i jak widać w linkach jest „Thread-safe”. Uważam że herezji tutaj nie ma. ;)

  1. Na razie brak trackbacków