Obiektowe metody projektowania systemów
Abstract Factory
design pattern
(aka. Kit)
Wstęp:
Abstract Factory – wzorzec kreacyjny pracujący w zakresie obiektowym
Intencja – Udostępnić interfejs, służący tworzeniu rodzin powiązanych lub
zależnych obiektów bez
wyspecyfikowania konkretnej klasy.
Plan:
Powody utworzenia, motywacja
Zastosowanie
Przykłady implementacji w C++
Struktura i elementy składowe
Konsekwencje użycia
Powiązania z innymi wzorcami Bibliografia
Powody utworzenia, motywacja
Tworzenie obiektów klas produktów należących do tej samej rodziny
Potrzeba zmieniania całej
wyspecjalizowanej rodziny obiektów, przy zachowaniu tych samych algorytmów
Przykład: podmienianie kontrolek dla różnych platform (MFC, Motif)
Zastosowanie
System powinien być niezależny od tego jak produkty są tworzone,
komponowane i reprezentowane.
System może używać jednej z wielu rodzin produktów.
Potrzebujemy spójnych rodzin, które są zawsze razem.
Przykłady implementacji w C++
(z użyciem factory method i ew. singleton)
class AbstractFactory { public:
AbstractFactory(); // dla singletona to powędruje do private
// AbstractFactory* GetFactoryInstance(int* params); // dla singletona
// tu używamy FactoryMethod dla każdego produktu virtual Product1* MakeProduct1()
{ return new Product1; }
virtual Product2* MakeProduct2() { return new Product2; }
virtual Product3* MakeProduct3(int param1) { return new Product3(param1); }
virtual Product4* MakeProduct4(int param1, int param2) { return new Product4(param1, param2); }
//private:
//static AbstractFactory *instance; // przygotowanie pod singletona };
Struktura i elementy składowe
Konsekwencje użycia
Zalety. Izoluje konkretne klasy.
Czyni podmienianie rodzin produktów łatwiejszym.
Nakłania do zachowania konsystencji wsród produktów.
Ale! Dokładanie produktów do rodzin jest trudne.
Powiązania z innymi wzorcami
Abstract Factory jest często
implementowane z wykorzystaniem Factory Method. Jest to eleganckie i czytelne rozwiązanie. Ale ma wady…
Można użyć Prototype, zamiast FM.
Konkretne fabryki są często Singletonami
Podsumowanie:
Klasa Factory pozwala zbudować system w oparciu o funcjonalność rodzin
abstrakcyjnych produktów, z drugiej strony tworzyć odmienne realizacje w oddzielnych rodzinach.
Czyli mamy wysoce elastyczny i elegancki kod, z oddzieloną implementacją
szczegółów od meritum problemu.
Bibliografia:
Gamma E.,Helm R.,Johnson R., Vlissides J.: Design Patterns: Elements of Reusable Object-Oriented
Software, Addison-Wesley, 1995
http://c2.com/cgi/wiki?AbstractFactory
http://hillside.net/patterns/
http://en.wikipedia.org/wiki/Abstract_factory_pattern
Alexandrescu A.: Modern C++ Design, Addison- Wesley, 2001
http://sourceforge.net/projects/loki-lib/