Sunteți pe pagina 1din 8

MINISTERUL EDUCAŢIEI, CULTURII și CERCETĂRII al REPUBLICII MOLDOVA

UNIVERSITATEA TEHNICĂ a MOLDOVEI


FACULTATEA CALCULATOARE, INFORMATICĂ și MICROELECTRONICĂ
DEPARTAMENTUL INGINERIA SOFTWARE și AUTOMATICĂ

RAPORT la lucrarea de laborator Nr. 2


Disciplina: Tehnici si Mecanisme de Proiectare Software
TEMA: Sablonul de proiectare BUILDER

Elaborat: st. gr. TI-171 Iepuras Daniel


Verficat: conf. univ. Scrob Sergiu

Chișinău – 2020
Definitie

Pattern-ul Builder dorește separarea construcției de obiecte complexe de reprezentarea


lor astfel încât același proces să poată crea diferite reprezentări.

Structura

Clasele și obiectele care participă la acest model sunt:

Constructor (VehicleBuilder)
specifică o interfață abstractă pentru crearea părților unui obiect Produs
ConcreteBuilder (MotorCycleBuilder, CarBuilder, ScooterBuilder)
construiește și asamblează părți ale produsului prin implementarea interfeței Builder
definește și ține evidența reprezentării pe care o creează oferă o interfață pentru
preluarea produsului
Director (magazin)
construiește un obiect folosind interfața Builder Produs (vehicul) reprezintă obiectul
complex în construcție. ConcreteBuilder construiește reprezentarea internă a
produsului și definește procesul prin care este asamblat include clase care definesc
părțile componente, inclusiv interfețe pentru asamblarea pieselor în rezultatul final.

Implementare

Sa ne imaginam ca avem nevoie de a crea o clasa cu o multime de parametri – de


exemplu , clasa Participant cu urmatoarele campuri :
public class Participant {

private String coachId;


private String coachName;
private String club;
private String participantCountry;
private String participant_id;
private String participantID;
private String participantName;
private String sex;
private String age;
private String weight;
private String birthday;
private String photo;
private String issue;
private String coachCountry;
private String firstName;
private String lastName;
private String countryId;
private String categoryName;
private String participantCountryFull;
private String participantFirstName;
private String participantLastName;
}

Iar acum sa ne imaginam, ca vrem pentru aceasta clasa sa stabilim toate


constructoarele posibile de care avem nevoie. De ce ? Pentru a utiliza diferiti
constructori in diferite parti ale codului si pentru a crea instante ale clasei Participant
cu un numar diferit de campuri completate (de exemplu, avem 6 campuri in clasa. Si
vrem sa completam doar 3 campuri).
Exemplu ar arata asftel:

public class Participant {

private String coachId;


private String coachName;
private String club;
private String participantCountry;
private String participant_id;
private String participantID;
private String participantName;
private String sex;
private String age;
private String weight;
private String birthday;
private String photo;
private String issue;
private String coachCountry;
private String firstName;
private String lastName;
private String countryId;
private String categoryName;
private String participantCountryFull;
private String participantFirstName;
private String participantLastName;

Participant(String coachId, String coachName, String club, String participantCountry,


String participant_id) {
this.coachId = coachId;
this.coachName = coachName;
this.club = club;
this.participantCountry = participantCountry;
this.participant_id = participant_id;
}

public Participant(String participantName, String sex, String age, String weight,


String birthday, String photo) {
this.participantName = participantName;
this.sex = sex;
this.age = age;
this.weight = weight;
this.birthday = birthday;
this.photo = photo;
}

//……….

Dupa cum se vede , avem 2 constructoare dar se poate intampla de a fi mai multe.
Problema

Problema consta in faptul ca noi vom trebui sa scrim diferite combinatii de parametri.
Mai mult de atat, va fi foarte usor sa facem accidental greseli in scrierea parametrilor
la locul lor. De exemplu putem scrie (“ Daniel “, “ Iepuras”) in loc de Participant
(“Iepuras”, “Daniel”), sau de exemplu putem incurca locul varstei cu inaltimea sau
gretatea deoarece ambii parametri sunt de acelasi tip si este posibil sa nu observam
eroarea pentru o lunga perioada de timp.

Sablonul de proiectare Builder ne ajuta sa rezolvam toate aceste probleme.

Pentru aceasta cream in clasa noastra inca o clasa si o numim Builder:

public static class Builder {


private String participantName;
private String coachName;
private String club;
private String participantCountry;
private String sex;
private String age;
private String weight;
private String birthday;

public Builder setParticipantName(final String participantName) {


this.participantName = participantName;
return this;
}

public Builder setCoachName(final String coachName) {


this.coachName = coachName;
return this;
}
public Builder setClub(final String club) {
this.club = club;
return this;
}
public Builder setParticipantCountry(final String participantCountry) {
this.participantCountry = participantCountry;
return this;
}
public Builder setSex(final String sex) {
this.sex = sex;
return this;
}
public Builder setAge(final String age) {
this.age = age;
return this;
}
public Builder setWeight(final String weight) {
this.weight = weight;
return this;
}
public Builder setBirthday(final String birthday) {
this.birthday = birthday;
return this;
}
public Participant create() {
return new Participant(this);
}
}

Ca sa fie mai usor , sa ne imaginam ca avem acest Builder doar pentru un parametru ,
de exemplu Name si sa o impartim in 3 parti:

Consturctor

Parametrul

Metoda care returneaza


obiectul creat.
In final completam formularul urmator:

Si apelam Builder-ul pentru creara unui participant pentru participarea ulterioara la


campionat:

Participant participant = new Participant.Builder()


.setParticipantName(etParticipantFirstName.getText().toString() + " " +
etParticipantLastName.getText().toString().trim())
.setParticipantCountry(etParticipantCountry.getText().toString().trim())
.setClub(etParticipantClub.getText().toString().trim())
.setBirthday(etParticipantBirthDay.getText().toString().trim())
.setCoachName(etParticipantCoachName.getText().toString().trim())
.setAge(etParticipantAge.getText().toString().trim().trim())
.setWeight(etParticipantWeight.getText().toString().trim())
.setSex(etGender.getText().toString().trim())
.create();
participantPresenter.addParticipant(participant);
Concluzie:

In concluzie pot sa spun ca sablonul de proiecate Builder are multe avantaje foarte
placute pentru orice dezvoltator. Unul foarte important este ca codul pare mult mai
usor de citit cu ajutorul acestu model de proiectare deoarece tot ce are legatura cu
crearea unui obiect este preluat intr-o clasa separate - Builder, de asemenea la
completarea campurilor obiectului , parametrii sunt mai greu de amestecat ceea ce ne
ajuta la evitarea erorilor.