Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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:​
poo/breviare/breviar-11.1765706564.txt.gz · Last modified: 2025/12/14 12:02 by george.tudor1906
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0