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 🙂
nie pomyliłeś przypadkiem nazwy wzorca? to, co prezentujesz, nie jest implementacją „factory method”
Nie pomyliłem. Jak najbardziej jest to implementacja wzorca Factory Method.
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 😉
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