Factory Method

Historyczna chwila, pierwszy wpis na blogu po polsku.

Po ponad miesiącu od ostatniego wpisu (niestety, mimo chęci, nie mogłem znaleźć chwili wolnego czasu) poruszę dzisiaj temat jednego z najczęściej używanych wzorców projektowych – Factory Method. Przy użyciu tego wzorca, możemy w prosty sposób zaimplementować funkcjonalność związaną z wytwarzaniem konkretnych „produktów” przez konkretne „fabryki”.

Żeby łatwiej przedstawić to, co mam na myśli, odwołam się do niedawnej reklamy pewnych słodyczy/batona składającego się z 2 części. Otóż mamy do czynienia z dwoma różnymi fabrykami, produkującymi kolejno prawy i lewy baton. Jest to idealne odwzorowanie naszego wzorca -> fabryka nr 1 (konkretna fabryka po lewej stronie) wytwarza konkretny produkt (lewy baton) oraz fabryka nr2 (konkretna fabryka po prawej stronie) wytwarza konkretny produkt (prawy baton). Następnie prawy i lewy baton są składane w jeden, gotowy produkt.

Poniżej umieszczam przykładową implementację wzorca, wykorzystującą interfejsy:

1) Tworzymy 2 interfejsy – IProduct oraz IFactory, w IFactory umieszczamy metodę IProduct FactoryMethod();

2) Następnie tworzymy klasę jednej fabryki:


namespace FactoryMethod
{
using FactoryMethod.Abstract;

class LeftFactory : IFactory
{
#region IFactory Members

public IProduct FactoryMethod()
{
return new LeftProduct();
}

#endregion
}
}

3) Drugiej fabryki:


namespace FactoryMethod
{
    using FactoryMethod.Abstract;

    class RightFactory : IFactory
    {
        #region IFactory Members

        public IProduct FactoryMethod()
        {
            return new RightProduct();
        }

        #endregion
    }
}

4) Klasa prawego produktu:


  class RightProduct : IProduct
    {
        #region IProduct Members

        #endregion
    }

5) Klasa lewego produktu:


  class LeftProduct : IProduct
    {
        #region IProduct Members

        #endregion
    }

6) Wywołanie:


using System;

namespace FactoryMethod
{
    using FactoryMethod.Abstract;

    class Program
    {
        static void Main(string[] args)
        {
            IFactory leftFactory = new LeftFactory();
            IProduct leftProduct = leftFactory.FactoryMethod();
            Console.WriteLine(leftProduct.GetType().ToString());

            IFactory rightFactory = new RightFactory();
            IProduct rightProduct = rightFactory.FactoryMethod();
            Console.WriteLine(rightProduct.GetType().ToString());

            Console.ReadKey();
        }
    }
}

Miłego „wzorcowania” z wykorzystaniem Factory Method 🙂

4 uwagi do wpisu “Factory Method

  1. Zapomniałeś opisać najważniejszej rzeczy – co daje zastosowanie tego wzorca. W przedstawionym przez Ciebie przykładzie widzę tylko masę nadmiarowego kodu – równie dobrze produkt prawy i lewy można stworzyć bezpośrednio, co w efekcie daje dwie linijki kodu 😉

    1. Chodziło bardziej o to, żeby pokazać jak taki wzorzec stworzyć – oczywiście, że można lewy i prawy produkt stworzyć bezpośrednio w 2 linijkach 😉

      Potrzebowalibyśmy tutaj jeszcze konkretnego produktu, jakim jest baton w całości. Przykład – chcemy produkt składający się z lewego i prawego, drugi produkt składający się z prawego i lewego, trzeci składający się tylko z prawego oraz czwarty tylko z lewego.

      Co do zastosowania – jest tego mnóstwo, zapraszam do lektury tego tematu:
      http://stackoverflow.com/questions/2386125/real-world-examples-of-factory-method-pattern

Zostaw komentarz

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

w

Connecting to %s