Post on 02-Feb-2016
description
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