This shows you the differences between two versions of the page.
|
poo:breviare:breviar-11 [2025/12/14 12:02] george.tudor1906 |
poo:breviare:breviar-11 [2025/12/14 17:41] (current) george.tudor1906 |
||
|---|---|---|---|
| Line 14: | Line 14: | ||
| * **Behavioral Patterns**: tratează modul de interacționare între obiecte (Observer, Strategy, Visitor, Command); | * **Behavioral Patterns**: tratează modul de interacționare între obiecte (Observer, Strategy, Visitor, Command); | ||
| - | * **Creational Patterns**: tratează modul de creare a obiectelor (Factory, Singleton); | + | * **Creational Patterns**: tratează modul de creare a obiectelor (Factory, Singleton, Builder); |
| * **Structural Patterns**: tratează modul cum este reprezentat un obiect și cum sunt relațiile între entități (Decorator, Composite, Proxy, Facade, Adapter). | * **Structural Patterns**: tratează modul cum este reprezentat un obiect și cum sunt relațiile între entități (Decorator, Composite, Proxy, Facade, Adapter). | ||
| Line 102: | Line 102: | ||
| Utilizări frecvente: | Utilizări frecvente: | ||
| - | * înlocuirea variabilelor globale (instanța Singleton este „globală”); | + | * înlocuirea variabilelor globale (instanța Singleton este „globală"); |
| * obiecte care reprezintă resurse partajate (de exemplu logger); | * obiecte care reprezintă resurse partajate (de exemplu logger); | ||
| * implementarea de Factory (vezi mai jos). | * implementarea de Factory (vezi mai jos). | ||
| Line 113: | Line 113: | ||
| De aceea folosim **Factory**, prin care alcătuim o familie de clase înrudite (prin moștenirea aceleiași clase abstracte sau implementarea aceleiași interfețe), | De aceea folosim **Factory**, prin care alcătuim o familie de clase înrudite (prin moștenirea aceleiași clase abstracte sau implementarea aceleiași interfețe), | ||
| iar crearea obiectului concret este delegată către o metodă de tip factory. | iar crearea obiectului concret este delegată către o metodă de tip factory. | ||
| + | |||
| + | {{:poo:breviare:factory_pattern_uml_diagram.jpg?500|}} | ||
| === Exemplu (pizzas) === | === Exemplu (pizzas) === | ||
| Line 173: | Line 175: | ||
| </code> | </code> | ||
| - | == 1.3 Singleton Factory == | + | == 1.3 Builder Pattern == |
| + | |||
| + | === Descriere === | ||
| + | |||
| + | Acest pattern este folosit în restaurantele de tip fast food care furnizează meniul pentru copii. | ||
| + | Un meniu pentru copii constă de obicei într-un fel principal, unul secundar, o băutură și o jucărie. | ||
| + | Pot exista variații în ceea ce privește conținutul meniului, dar procesul de creare este același. | ||
| + | Fie că la felul principal se alege un hamburger sau un cheeseburger, procesul va fi același. | ||
| + | Vânzătorul le va indica celor din spate ce să pună pentru fiecare fel de mâncare, pentru băutură și jucărie. | ||
| + | Toate acestea vor fi puse într-o pungă și servite clienților. | ||
| + | |||
| + | {{:poo:breviare:img.jpg?500|}} | ||
| + | |||
| + | Acest șablon realizează **separarea construcției de obiecte complexe de reprezentarea lor** astfel încât | ||
| + | același proces să poată crea diferite reprezentări. Builder-ul creează părți ale obiectului complex | ||
| + | de fiecare dată când este apelat și reține toate stările intermediare. Când produsul este terminat, | ||
| + | clientul primește rezultatul de la builder. | ||
| + | |||
| + | În acest mod, se obține un control mai mare asupra procesului de construcție de noi obiecte. | ||
| + | Spre deosebire de alte pattern-uri din categoria creational, care creau produsele într-un singur pas, | ||
| + | pattern-ul **Builder construiește un produs pas cu pas** la comanda coordonatorului. | ||
| + | |||
| + | === Exemplu (User cu atribute required și optional) === | ||
| + | |||
| + | <code java> | ||
| + | public class User { | ||
| + | private final String firstName; // required | ||
| + | private final String lastName; // required | ||
| + | private final int age; // optional | ||
| + | private final String phone; // optional | ||
| + | private final String address; // optional | ||
| + | |||
| + | private User(UserBuilder builder) { | ||
| + | this.firstName = builder.firstName; | ||
| + | this.lastName = builder.lastName; | ||
| + | this.age = builder.age; | ||
| + | this.phone = builder.phone; | ||
| + | this.address = builder.address; | ||
| + | } | ||
| + | |||
| + | public String getFirstName() { | ||
| + | return firstName; | ||
| + | } | ||
| + | |||
| + | public String getLastName() { | ||
| + | return lastName; | ||
| + | } | ||
| + | |||
| + | public int getAge() { | ||
| + | return age; | ||
| + | } | ||
| + | |||
| + | public String getPhone() { | ||
| + | return phone; | ||
| + | } | ||
| + | |||
| + | public String getAddress() { | ||
| + | return address; | ||
| + | } | ||
| + | |||
| + | public String toString() { | ||
| + | return "User:" + this.firstName + " " + this.lastName + " " + | ||
| + | this.age + " " + this.phone + " " + this.address; | ||
| + | } | ||
| + | |||
| + | public static class UserBuilder { | ||
| + | private final String firstName; | ||
| + | private final String lastName; | ||
| + | private int age; | ||
| + | private String phone; | ||
| + | private String address; | ||
| + | |||
| + | public UserBuilder(String firstName, String lastName) { | ||
| + | this.firstName = firstName; | ||
| + | this.lastName = lastName; | ||
| + | } | ||
| + | |||
| + | public UserBuilder age(int age) { | ||
| + | this.age = age; | ||
| + | return this; | ||
| + | } | ||
| + | |||
| + | public UserBuilder phone(String phone) { | ||
| + | this.phone = phone; | ||
| + | return this; | ||
| + | } | ||
| + | |||
| + | public UserBuilder address(String address) { | ||
| + | this.address = address; | ||
| + | return this; | ||
| + | } | ||
| + | |||
| + | public User build() { | ||
| + | return new User(this); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | public static void main(String[] args) { | ||
| + | User user1 = new User.UserBuilder("Lokesh", "Gupta") | ||
| + | .age(30) | ||
| + | .phone("1234567") | ||
| + | .address("Fake address 1234") | ||
| + | .build(); | ||
| + | |||
| + | User user2 = new User.UserBuilder("Jack", "Reacher") | ||
| + | .age(40) | ||
| + | .phone("5655") | ||
| + | //no address | ||
| + | .build(); | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | == 1.4 Singleton Factory == | ||
| O clasă de tip Factory poate fi utilizată în mai multe locuri în cadrul unui proiect. Pentru a economisi resurse, | O clasă de tip Factory poate fi utilizată în mai multe locuri în cadrul unui proiect. Pentru a economisi resurse, | ||
| putem folosi pattern-ul **Singleton** pentru Factory, astfel încât să existe o singură instanță a clasei Factory. | putem folosi pattern-ul **Singleton** pentru Factory, astfel încât să existe o singură instanță a clasei Factory. | ||
| + | |||
| === 2. Behavioral Patterns === | === 2. Behavioral Patterns === | ||
| Line 188: | Line 304: | ||
| Observatorii sunt obiecte dependente de subiect și sunt notificate automat de către subiect atunci când în subiect are loc o acțiune | Observatorii sunt obiecte dependente de subiect și sunt notificate automat de către subiect atunci când în subiect are loc o acțiune | ||
| sau o modificare a stării. | sau o modificare a stării. | ||
| + | |||
| + | {{:poo:breviare:observer_breviar.png?500|}} | ||
| == 2.2 Strategy Pattern == | == 2.2 Strategy Pattern == | ||
| Line 196: | Line 314: | ||
| încapsulate în clase care oferă o interfață comună de folosire. | încapsulate în clase care oferă o interfață comună de folosire. | ||
| Clientul (utilizatorul) poate alege dinamic strategia care va fi folosită. | Clientul (utilizatorul) poate alege dinamic strategia care va fi folosită. | ||
| + | |||
| + | {{:poo:breviare:strategy_breviar.png?500|}} | ||
| Exemplu de motivare: la căutarea unui element într-o colecție, putem alege algoritmul în funcție de proprietăți ale colecției | Exemplu de motivare: la căutarea unui element într-o colecție, putem alege algoritmul în funcție de proprietăți ale colecției | ||
| Line 208: | Line 328: | ||
| Pe scurt, folosim **Visitor** dacă avem tipuri diferite și dorim să adăugăm/schimbăm operații fără să modificăm clasele. | Pe scurt, folosim **Visitor** dacă avem tipuri diferite și dorim să adăugăm/schimbăm operații fără să modificăm clasele. | ||
| + | |||
| + | {{:poo:breviare:visitor.jpg?500|}} | ||
| În cadrul pattern-ului: | În cadrul pattern-ului: | ||