(wybrane) Wzorce projektowe Programowanie Obiektowe Mateusz Cicheński
Kreacyjne Fabryka abstrakcyjna (Abstract Factory) Budowniczy (Builder) Metoda wytwórcza (Factory Method) Prototyp (Prototype) Singleton Strukturalne Adapter (Wrapper) Kompozyt (Composite) Dekorator (Decorator) Fasada (Facade) Pełnomocnik (Proxy) Pyłek (Flyweight) Czynnościowe (behawioralne) Mediator Pamiątka (Memento) Polecenie (Command) Strategia (Strategy) Plan zajęć
Fabryka abstrakcyjna Wzorce kreacyjne
<<interface> AbstractFactory AnotherFactory +createobjecta() : ObjectA +createobjectb() : ObjectB +createobjecta() : ObjectA +createobjectb() : ObjectB ObjectA ConcreteFactory +createobjecta() : ObjectA +createobjectb() : ObjectB Fabryka abstrakcyjna Wzorce kreacyjne ObjectB AbstractFactory factory = new ConcreteFactory(); ObjectA a = factory.createobjecta(); factory = new AnotherFactory(); ObjectB b = factory.createobjectb();
3 2 1 Budowniczy Wzorce kreacyjne
<<interface> Builder +buildpart() Director -builder: Builder +construct() ConcreteBuilder <create> Product +buildpart() +getproduct() : Product void construct() { builder.buildpart(); builder.buildpart(); } Budowniczy Wzorce kreacyjne Builder builder = new ConcreteBuilder(); Director = new Director(builder); Director.construct(); Product product = builder.getproduct();
Metoda wytwórcza Wzorce kreacyjne
Creator <create> Product +factorymethod() : Product SpecialCreator <create> SpecialProduct +factorymethod() : Product Metoda wytwórcza Wzorce kreacyjne Creator creator = new ConcreteCreator(); Product product = creator.factorymethod(); creator = new SpecialCreator(); Product product = creator.factorymethod();
Prototyp Wzorce kreacyjne
<<interface>> Prototype +clone() : Prototype Prototype *prototype = new ConcretePrototype(); ConcretePrototype *clone = dynamic_cast<concreteprototype*> prototype.clone(); clone->dosomething(); ConcretePrototype +clone() : Prototype +dosomething() W C++ metoda clone() powinna zwracać wskaźnik na obiekt Prototype. Rzutowanie można wykonać przy pomocy dynamic_cast<>. Prototype prototype = new ConcretePrototype(); Prototype clone = prototype.clone() as ConcretePrototype; clone.dosomething(); Prototyp Wzorce kreacyjne
Singleton Wzorce kreacyjne
Singleton -instance : Singleton; +getinstance() : Singleton +dosomething() W C++ metoda getinstance() powinna zwracać wskaźnik na obiekt Singleton, a zmienna instance powinna być wskaźnikiem na obiekt Singleton. Singleton singleton = Singleton.getInstance(); singleton.dosomething(); Singleton Wzorce kreacyjne
Fabryka abstrakcyjna konstrukcja obiektów podobnego typu (np. różnych typów pojazdów) Budowniczy konstrukcja skomplikowanych elementów przy pomocy drobnych kroków Metoda wytwórcza konstrukcja nowego elementu (bez wywołania konstruktora explicite) Prototyp możliwość kopiowania obiektów (np. w połączeniu ze wzorcem Pamiątki) Singleton dostęp do bazy danych, utrzymanie pojedynczego połączenia z bazą Przykłady użycia Wzorce kreacyjne
Adapter (Wrapper) Wzorce strukturalne
Adaptee +methodb() Adaptor #adaptee : Adaptee +methoda() void methoda() { adaptee.methodb(); } Adaptee adaptee; Adaptor adaptor = = new Adaptor(adaptee); adaptor.methoda(); Adapter (Wrapper) Wzorce strukturalne
Podwyżka dla działu PR Kompozyt Wzorce strukturalne
0..* <<interface>> Component Leaf +operation() +operation() 1 Composite +operation() +add(item : Component) +removeat(index : int) +getchildat(index : int) Kompozyt Wzorce strukturalne Composite composite = new Composite(); composite.add(new Leaf()); composite.add(new Leaf()); composite.operation();
Dekorator Wzorce strukturalne
<<interface>> Component ConcreteComponent +operation() +operation() Decorator ConcreteDecorator -component : Component +operation() +operation() +newoperation() Dekorator Wzorce strukturalne
Fasada Wzorce strukturalne
Facade +operation() PoorAPIClass +xyz() +mjuyhn() void operation() { xyz(); mjuyhn(); } //no need to include PoorAPIClass Facade facade = new Facade(); facade.operation(); Fasada Wzorce strukturalne
Pełnomocnik Wzorce strukturalne
<<interface>> Object +simple() +complex() RealObject +simple() +complex() ProxyObject delegate +simple() +complex() Object object = new ProxyObject(); object.simple(); object.complex(); Pełnomocnik Wzorce strukturalne
Pyłek Wzorce strukturalne
FlyweightFactory -objects[] +getobject(id) : FlyweightObject <create> FlyweightObject FlyweightFactory::getObject(ID) { if (objects.contains(id) == NULL) { FlyweightObject obj = new FlyweightObject(ID); FlyweightObject objects.add(id, obj); } return objects[id]; } Pyłek Wzorce strukturalne FlyweightFactory factory = new FlyweightFactory(); factory.getobject(15); factory.getobject(17); factory.getobject(15);
Adapter utworzenie interfejsu zgodnego z naszą aplikacją, który wykorzystuje możliwości dostarczane przez inny interfejs (niezgodny z naszą aplikacją) Kompozyt tworzenie drzewa obiektów, możliwość wykonywania operacji grupowych na takim drzewie Dekorator możliwość rozszerzania funkcjonalności danej klasy w trakcie działania aplikacji (w przeciwieństwie do dziedziczenia, które to umożliwia na etapie kompilacji) Fasada utworzenie prostego interfejsu ukrywającego inne, bardziej skomplikowane interfejsy Pełnomocnik odkładanie utworzenia skomplikowanego obiektu o dużym zapotrzebowaniu zasobów do czasu kiedy faktycznie taki obiekt musi zostać utworzony Pyłek redukcja zużycia zasobów przez zwracanie tego samego obiektu o wskazanych parametrach (zamiast tworzenia za każdym razem kopii o tych samych parametrach), np. glify typograficzne Przykłady użycia Wzorce strukturalne
Mediator Wzorce behawioralne
<<interface>> Mediator * <<interface>> Colleague +handlenotify() +notify() ConcreteMediator ConcreteColleague +handlenotify() void handlenotify() { //perform specific action //on other Colleague } Mediator Wzorce behawioralne ConcreteMediator mediator = new ConcreteMediator(); Colleague colleague = new ConcreteCollegue(); mediator.add(colleague); colleague.notify();
Pamiątka Wzorce behawioralne
Memento Caretaker -state +setstate() +getstate() <create> Originator -state +operation(); +creatememento() : Memento +restore(memento : Memento) Originator originator = new Originator(); Memento previousstate = originator.creatememento(); originator.operation(); originator.restore(previousstate); Pamiątka Wzorce behawioralne
Kochanie, wynieś proszę śmieci! Synu, wynieś śmieci! Zawsze ja Polecenie Wzorce behawioralne
<<interface>> Command Invoker +execute() ConcreteCommand Receiver +execute() +action() void execute() { receiver.action(); } Polecenie Wzorce behawioralne
Strategia Wzorce behawioralne
<<interface>> Strategy Context +algorithm() +executestrategy() ConcreteStrategy + algorithm() ConcreteStrategy strategy = new ConcreteStrategy(); Context context = new Context(strategy); context.executestrategy(); Strategia Wzorce behawioralne
Mediator zależność pomiędzy obiektami jest zdefiniowana w mediatorze, obiekty nie posiadają bezpośrednio referencji do obiektów, z którymi wymieniają dane Pamiątka zapisywanie aktualnego stanu obiektu, funkcjonalność cofnij Polecenie zdefiniowanie funkcjonalności jako polecenia, które może być przypisane pod kilka elementów GUI Strategia w zależności od kontekstu zaaplikowanie odpowiedniej metody/algorytmu do danych (np. walidacja pól zawierających różne typy danych jak daty, liczby, ciągi znaków) Przykłady użycia Wzorce behawioralne