Creational Design Patterns in Kotlin: Builder

1. Introduktion

I denne hurtige artikel vil vi se, hvordan man implementerer Builder Design Pattern i Kotlin.

2. Byggemønster

Builder-mønsteret er det, som folk ofte bruger, men sjældent skaber alene.

Det er dejligt at håndtere opbygningen af ​​objekter, der kan indeholde mange parametre, og når vi vil gøre objektet uforanderligt, når vi er færdige med at konstruere det.

For at lære mere, se vores tutorial om Creational Design Patterns her.

3. Implementering

Kotlin giver mange nyttige funktioner såsom navngivne og standardparametre, ansøge() og dataklasse hvilket undgår brugen af ​​klassisk Builder-mønsterimplementering.

Af den grund vil vi først se en klassisk implementering af Java-stil og derefter en mere Kotlin-stil kort form.

3.1. Implementering af Java-stil

Lad os begynde at oprette en klasse - Madbestilling - som indeholder skrivebeskyttede felter, da vi ikke vil have ydre objekter direkte adgang til dem:

klasse FoodOrder privat konstruktør (bygherre: FoodOrder.Builder) {val brød: String? val krydderier: String? val kød: streng? val fisk: String? init {this.bread = builder.bread this.condiments = builder.condiments this.meat = builder.meat this.fish = builder.fish} class Builder {// builder code}}

Læg mærke til det konstruktøren er privat så kun de indlejrede Bygger klasse kan få adgang til det.

Lad os nu gå videre med at oprette den indlejrede klasse, der vil blive brugt til at bygge objekter:

class Builder {var brød: String? = null privat sæt var krydderier: Streng? = null privat sæt var kød: String? = null privat sæt var fisk: String? = null privat sæt sjovt brød (brød: streng) = anvend {this.bread = brød} sjove krydderier (krydderier: streng) = anvend {this.condiments = krydderier} sjovt kød (kød: streng) = anvend {this.meat = kød} sjov fisk (fisk: streng) = anvend {this.fish = fisk} sjov build () = FoodOrder (dette)} 

Som vi ser, vores Bygger har de samme felter som den ydre klasse. For hvert ydre felt har vi en matchende setter-metode.

Hvis vi har et eller flere obligatoriske felter, i stedet for at bruge settermetoder, lad os få en konstruktør til at indstille dem.

Bemærk, at vi bruger ansøge funktion for at understøtte den flydende designtilgang.

Endelig med bygge metode, vi kalder Madbestilling konstruktør.

3.2. Implementering i Kotlin-stil

For at drage fuld fordel af Kotlin er vi nødt til at gennemgå nogle af de bedste fremgangsmåder, vi blev vant til i Java. Mange af dem kan erstattes med bedre alternativer.

Lad os se, hvordan vi kan skrive en idiomatisk Kotlin-kode:

klasse FoodOrder privat konstruktør (val brød: streng ?, val krydderier: streng ?, val kød: streng ?, val fisk: streng?) {dataklasse Builder (var brød: streng? = null, var krydderier: streng? = null, var kød: String? = null, var fisk: String? = null) {sjovt brød (brød: streng) = anvend {this.bread = brød} sjove krydderier (krydderier: String) = anvend {this.condiments = krydderier} sjov kød (kød: String) = anvend {this.meat = kød} sjov fisk (fisk: String) = anvend {this.fish = fisk} sjov build () = FoodOrder (brød, krydderier, kød, fisk)}}

Kotlin leveres med navngivne og standardparametre hjælper med at minimere antallet af overbelastninger og forbedre læsbarheden af ​​funktionsopkaldet.

Vi kan også drage fordel af Kotlins dataklassestruktur, som vi udforsker mere i en anden tutorial her.

Endelig såvel som i Java-stil implementering, ansøge() er nyttig til implementering af flydende settere.

4. Eksempel på anvendelser

Kort sagt, lad os se på, hvordan man bygger Madbestilling objekter, der bruger disse Builder-mønsterimplementering:

val foodOrder = FoodOrder.Builder () .brød ("hvidt brød") .kød ("bacon"). krydderier ("olivenolie") .build () 

5. Konklusion

Builder-mønsteret løser et meget almindeligt problem i den objektorienterede programmering af, hvordan man fleksibelt opretter et uforanderligt objekt uden at skrive mange konstruktører.

Når vi overvejer en bygherre, skal vi fokusere på, om konstruktionen er kompleks eller ej. Hvis vi har for enkle konstruktionsmønstre, kan indsatsen for at skabe vores fleksible bygherreobjekt langt overstige fordelen.

Som altid er koden tilgængelig på Github.