Zakres Wzorce projektowe - kreacyjne -Factory Method -Abstract Factory
2 Wzorce kreacyjne Wzorce kreacyjne abstrahują proces tworzenia instancji obiektu. Ukrywają informacje o tym jak obiekt jest tworzony; w efekcie pomagaja uniezależnić system od tego jak obiekty są tworzone i komponowane
3 Wzorce Factory Wzorce kreacyjne klas – wykorzystują dziedziczenie do tworzenia instancji – Factory Method Wzorce kreacyjne obiektów skupiają się na delegowaniu tworzenia instancji do innego obiektu – Abstract Factory
4 Wzorce Factory Idiom dla tworzenia obiektu – w j. Java operator new Wzorce kreacyjne tworzą nowe obiekty nie używając jawnie new. Można pisać metody tworzące instancje różnych obiektów, które można rozszerzyć do tworzenia instancji nowo-tworzonych obiektów bez zmiany kodu.
5 Factory Method: cel Zdefiniować interfejs do tworzenia obiektu; podklasy decydują, której klasy instancję utworzyć. F.M. poleca klasie przekazać tworzenie instancji do podklasy
6 Factory Method: wykorzystanie Wykorzystujemy gdy: - klasa nie może określić, które obiekty mają być utworzone
7 Factory method: uczestnicy Product – definiuje interfejs typu obiektów tworzonych za pomocą FactoryMethod ConcretProduct implementuje interfejs produktu Creator deklaruje FactoryMethod, która zwraca obiekt typu Product ConcretCreator nadpisuje FactoryMethod, aby zwrócić instancję ConcretProduct
8 Factory Method: przykład1
9 Factory Method: przykład2
10 Factory Method: przykład2 (2) Klasa MazeGame z metodą createMaze()
11 Factory Method: przykład2 (3)
12 Factory Method: przykład2 (4) Dodajemy metody (factory methods)
13 Factory Method: przykład2 (5)
14 Factory Method: przykład2 (6) createMaze() – bardziej złożony, ale elastyczny Klasa EnchantedMazeGame Metoda createMaze() z MazeGame jest dziedziczona
15 Factory Method: przykład2 (7) Metoda createMaze() z Mazegame przekazuje tworzenie obiektu maze do podklas (działanie wzorca F.M.) Korelacje: Creator => MazeGame ConcreteCreator => EnchantedMazeGame (MazeGame jest też ConcreteCreator) Product => MapSite ConcreteProduct => Wall, Room, Door, EnchantedWall, EnchantedRoom, EnchantedDoor
16 Abstract Factory: cel Dostarczyć interfejs dla utworzenia rodziny powiązanych lub zależnych obiektów bez specyfikowania ich konkretnych klas Klasa deleguje odpowiedzialność tworzenia instancji obiektu do innego obiektu (przez kompozycję), a F.M. wykorzystuje dziedziczenie Delegowany obiekt często wykorzystuje F.M. do tworzenia instancji
17 Abstract Factory: przykład Narzędzie tworzenia GUI z wieloma look-and-feels
18 Abstract Factory: zastosowanie System powinien być niezależny od tego jak są tworzone, komponowane i reprezentowane jego produkty System musi wykorzystać jedną ze zbioru rodziny produktów Rodzina powiązanych produktów produktów jest utworzona do wspólnego wykorzystania
19 Abstract Factory: struktura
20 Abstract Factory: zastosowanie Zastosowanie do MazeGame – MazeFactory kolekcja factory methods (równocześnie Abstractfactory i Concretefactory)
21 Abstract Factory: zastosowanie (1) Metoda createMaze() z klasy MazeGame ma jako parametr MazeFactory
22 Abstract Factory: zastosowanie (2) createMaze() deleguje odpowiedzialnośc za tworzenie obiektu labirynt do obiektu MazeFactory
23 Abstract Factory: zastosowanie (3) Łatwo rozszerzyć MazeFactory do tworzenia innych
24 Abstract Factory: konsekwencje Izoluje klientów od implementacji konkretnych klas Łatwa wymiana rodziny produktów, ponieważ poszczególna konkretna fabryka może wspomagać rodzinę produktów Wspomaga wykorzystanie produktów z jednej rodziny - nowy rodzaj produktu wymaga zmiany interfejsu Abstractfactory
25 Abstract Factory: implementacja Aplikacje typowo wykorzystują jedną instancję konkretnej fabryki Wykorzystać w tym celu wzór Singleton