Pola Desain Kreasi di Kotlin: Builder

1. Perkenalan

Dalam artikel singkat ini, kita akan melihat cara mengimplementasikan Pola Desain Builder di Kotlin.

2. Pola Pembangun

Pola Builder adalah pola yang sering digunakan orang tetapi jarang dibuat sendiri.

Sangat bagus untuk menangani pembangunan objek yang mungkin berisi banyak parameter dan ketika kita ingin membuat objek tidak berubah setelah kita selesai membangunnya.

Untuk mempelajari lebih lanjut, lihat tutorial kami tentang Pola Desain Kreasi di sini.

3. Implementasi

Kotlin menyediakan banyak fitur berguna seperti parameter bernama dan default, apply (), dan kelas data yang menghindari penggunaan implementasi pola Builder klasik.

Oleh karena itu, pertama-tama kita akan melihat implementasi gaya Java klasik dan kemudian bentuk pendek gaya Kotlin.

3.1. Implementasi Bergaya Java

Mari kita mulai membuat satu kelas - FoodOrder - yang berisi bidang hanya-baca karena kita tidak ingin objek luar mengaksesnya secara langsung:

class FoodOrder private constructor(builder: FoodOrder.Builder) { val bread: String? val condiments: String? val meat: String? val fish: String? init { this.bread = builder.bread this.condiments = builder.condiments this.meat = builder.meat this.fish = builder.fish } class Builder { // builder code } }

Perhatikan bahwa konstruktor bersifat pribadi sehingga hanya kelas Builder bersarang yang dapat mengaksesnya.

Sekarang mari kita lanjutkan membuat kelas bersarang yang akan digunakan untuk membangun objek:

class Builder { var bread: String? = null private set var condiments: String? = null private set var meat: String? = null private set var fish: String? = null private set fun bread(bread: String) = apply { this.bread = bread } fun condiments(condiments: String) = apply { this.condiments = condiments } fun meat(meat: String) = apply { this.meat = meat } fun fish(fish: String) = apply { this.fish = fish } fun build() = FoodOrder(this) } 

Seperti yang kita lihat, Builder kita memiliki bidang yang sama dengan kelas luarnya. Untuk setiap bidang luar, kami memiliki metode penyetel yang cocok.

Jika kita memiliki satu atau lebih bidang wajib, daripada menggunakan metode penyetel, mari kita buat konstruktor mengaturnya.

Perhatikan bahwa kami menggunakan fungsi terapkan untuk mendukung pendekatan desain yang lancar.

Terakhir, dengan metode build , kami memanggil konstruktor FoodOrder .

3.2. Implementasi Gaya Kotlin

Untuk memanfaatkan Kotlin sepenuhnya, kami harus meninjau kembali beberapa praktik terbaik yang biasa kami lakukan di Java. Banyak dari mereka dapat diganti dengan alternatif yang lebih baik.

Mari kita lihat bagaimana kita dapat menulis kode Kotlin idiomatik:

class FoodOrder private constructor( val bread: String?, val condiments: String?, val meat: String?, val fish: String?) { data class Builder( var bread: String? = null, var condiments: String? = null, var meat: String? = null, var fish: String? = null) { fun bread(bread: String) = apply { this.bread = bread } fun condiments(condiments: String) = apply { this.condiments = condiments } fun meat(meat: String) = apply { this.meat = meat } fun fish(fish: String) = apply { this.fish = fish } fun build() = FoodOrder(bread, condiments, meat, fish) } }

Kotlin hadir dengan parameter bernama dan default membantu meminimalkan jumlah kelebihan beban dan meningkatkan keterbacaan pemanggilan fungsi.

Kita juga dapat memanfaatkan struktur kelas data Kotlin yang kita pelajari lebih lanjut dalam tutorial lain di sini.

Terakhir, seperti halnya dalam implementasi gaya Java, apply () berguna untuk mengimplementasikan penyetel fasih.

4. Contoh Penggunaan

Secara singkat, mari kita lihat cara membuat objek FoodOrder menggunakan implementasi pola Builder ini:

val foodOrder = FoodOrder.Builder() .bread("white bread") .meat("bacon") .condiments("olive oil") .build() 

5. Kesimpulan

Pola Builder memecahkan masalah yang sangat umum dalam pemrograman berorientasi objek tentang cara membuat objek yang tidak berubah secara fleksibel tanpa menulis banyak konstruktor.

Saat mempertimbangkan seorang pembangun, kita harus fokus pada apakah konstruksinya rumit atau tidak. Jika kita memiliki pola konstruksi yang terlalu sederhana maka upaya membuat objek builder fleksibel kita mungkin jauh melebihi manfaatnya.

Seperti biasa, kode tersedia di Github.