Designmønstre i Android - Builder

Designmønstre er genanvendelige løsninger til de mest almindeligt forekommende softwareproblemer. De kan fremskynde udviklingsprocessen ved at tilvejebringe en bevist måde at løse hyppige problemer.

I denne serie med artikler vil jeg gerne introducere de mest almindelige designmønstre med eksempler på Android-implementeringer i praksis.

Introduktion

Designmønstre kan opdeles i de tre sektioner:

  • Kreative designmønstre leverer løsninger til oprettelse af klasser, objekter (Singleton, Factory, Builder osv.)
  • Strukturelle designmønstre handler om arrangement af klasser og genstande (f.eks. Sammensat, facade, adapter)
  • Adfærdsmæssige designmønstre giver os måder at kommunikere mellem objekter og klasser på (kommando, observatør, strategi osv.)

Bygger

Builder-mønster forenkler oprettelse af objekter på meget ren og læselig måde. Det er meget nyttigt, når vi har nogle modelklasser med mange parametre. Vi kan gøre nogle af dem valgfri eller påkrævet, og vi tvinger ikke brugeren til at bruge en bestemt rækkefølge (som i konstruktøren). Ved at bruge Builder-mønster resulterer vi i metodernes elegante kæde. Den mest almindelige anvendelse er i AlertDialog.Builder () -klassen:

ny AlertDialog.Builder (dette)
        .setTitle ("Designmønstre")
        .setMessage ("Builder er fantastisk")
        .skab();

Hvordan kan vi oprette Builder-klasse til vores eget brug?

Builder i praksis

Lad os antage, at vi har en modelklasse til brugeren:

bruger af den offentlige klasse {
    privat streng første navn;
    privat String efternavn;
    privat int alder;
}

Og i stedet for at oprette objekter i denne klasse ved hjælp af konstruktører, ønsker vi at oprette dem ved hjælp af Builder-mønster som dette:

ny bruger.Builder ()
        .setFirstName ( "Leonardo")
        .setLastName ("da Vinci")
        .setAge (67)
        .skab();

Hvordan kan vi gøre det? For det første er vi nødt til at oprette Builder-klasse i brugerklasse, som har metoder til at opbygge vores objekt. Nøglen til at have kædemetoder er, at builder-metoder returnerer Builder-klassen. Se på eksemplet:

statisk klasse Builder {
    privat streng første navn;
    privat String efternavn;
    privat int alder;

    public Builder setFirstName (final String firstName) {
        this.firstName = firstName;
        returner dette;
    }

    public Builder setLastName (sidste String efternavn) {
        this.lastName = efternavn;
        returner dette;
    }

    public Builder setAge (endelig interval) {
        this.age = alder;
        returner dette;
    }

    offentlig brugeroprettelse () {
        returner ny bruger (dette);
    }
}

For hver parameter har vi en sætter - forskellen er, at disse metoder returnerer Builder-typen. I slutningen har vi en metode, der bruger konstruktør fra brugerklasse og returnerer brugerobjektet - her er det sted, hvor vores rod bliver holdt skjult.

Derefter skal vi oprette konstruktør med alle parametre i modelklasse Bruger:

bruger af den offentlige klasse {
    privat streng første navn;
    privat String efternavn;
    privat int alder;

    privat bruger (endelig Builder Builder) {
        firstName = builder.firstName;
        lastName = builder.lastName;
        alder = builder.age;
    }
}

Vigtig ting her er, at brugerkonstruktøren er privat, så den ikke kan fås adgang til fra den anden klasse, og vi skal bruge Builder til at oprette et nyt objekt.

Naturligvis kan vi lave nogle af de krævede parametre (som for nu er alle valgfri) ved at ændre vores create () -metode og kaste nogle undtagelser, f.eks.

offentlig brugeroprettelse () {
    Brugerbruger = ny bruger (fornavn, efternavn, alder);
    if (user.firstName.is Tom ()) {
        kaste ny IllegalStateException (
           "Fornavn kan ikke være tomt!");
    }
    returnerende bruger;
}

Det er det. På denne måde oprettede vi vores User.Builder () -klasse!

Builder - protip

Hvis du var tålmodig nok til at komme igennem hele blogindlægget, har jeg et tip til dig angående Builder-mønster: du kan generere hele Builder-klassen ved hjælp af IntelliJ!

Alt hvad du skal gøre er at placere caret på konstruktøren i din klasse og vælge Refactor -> Erstat Constructor med Builder i genvejsmenuen. Builder klasse med alle metoder vil blive automatisk genereret, klar til brug.

Du kan læse mere her: IntelliJ: Udskift konstruktør med bygmester

Konklusion

Builder-mønster er en god tilgang, ikke kun for modelklasser, men for hvert objekt, der har mere end tre eller fire parametre. Med lidt ekstra arbejde kan vi øge læsbarheden af ​​vores kode. Designmønstre anerkendes som den bedste praksis, så det er en stor fordel, hvis du kender nogle af dem, og Builder er en god en til at starte med.

Hold øje med mere!