Corak Reka Bentuk Penciptaan di Kotlin: Pembina

1. Pengenalan

Dalam artikel ringkas ini, kita akan melihat bagaimana menerapkan Pola Reka Bentuk Builder di Kotlin.

2. Corak Pembina

Corak Pembina adalah corak yang sering digunakan oleh orang tetapi jarang dibuat sendiri.

Sangat bagus untuk menangani pembinaan objek yang mungkin mengandungi banyak parameter dan ketika kita ingin menjadikan objek itu tidak berubah setelah kita selesai membinanya.

Untuk mengetahui lebih lanjut, lihat tutorial kami mengenai Pola Reka Bentuk Penciptaan di sini.

3. Pelaksanaan

Kotlin menyediakan banyak ciri berguna seperti parameter bernama dan lalai, menerapkan () dan kelas data yang mengelakkan penggunaan pelaksanaan corak Builder klasik.

Untuk itu, kita akan melihat pelaksanaan gaya Java klasik dan kemudian bentuk pendek gaya Kotlin.

3.1. Pelaksanaan Gaya-Jawa

Mari mula buat satu kelas - FoodOrder - yang mengandungi medan baca sahaja kerana kami tidak mahu 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 bahawa konstruktor adalah peribadi sehingga hanya kelas Builder bersarang yang dapat mengaksesnya.

Sekarang mari kita terus membuat kelas bersarang yang akan digunakan untuk membina 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, Pembina kami mempunyai bidang yang sama dengan kelas luar. Untuk setiap medan luar, kami mempunyai kaedah setter yang sepadan.

Sekiranya kita mempunyai satu atau lebih bidang wajib, bukannya menggunakan kaedah setter, mari kita buat konstruktor menetapkannya.

Perhatikan bahawa kita menggunakan dikenakan fungsi untuk menyokong pendekatan reka bentuk yang fasih.

Akhirnya, dengan kaedah membina , kami memanggil konstruktor FoodOrder .

3.2. Pelaksanaan Gaya Kotlin

Untuk memanfaatkan sepenuhnya Kotlin, kita harus melihat semula beberapa amalan terbaik yang biasa kita lakukan di Jawa. Banyak dari mereka boleh diganti dengan alternatif yang lebih baik.

Mari lihat bagaimana kita dapat menulis kod Kotlin yang 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 dilengkapi dengan parameter bernama dan lalai yang membantu mengurangkan bilangan beban berlebihan dan meningkatkan pembacaan fungsi panggilan.

Kami juga dapat memanfaatkan struktur kelas data Kotlin yang kami kaji lebih lanjut dalam tutorial lain di sini.

Akhirnya, begitu juga dalam implementasi gaya Java, menerapkan () berguna untuk menerapkan pengatur yang lancar.

4. Contoh Penggunaan

Secara ringkas, mari kita lihat bagaimana membina objek FoodOrder menggunakan pelaksanaan corak Builder ini:

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

5. Kesimpulan

Corak Pembangun menyelesaikan masalah yang sangat biasa dalam pengaturcaraan berorientasikan objek bagaimana membuat objek yang tidak berubah secara fleksibel tanpa menulis banyak pembina.

Semasa mempertimbangkan pembina, kita harus menumpukan pada apakah pembinaannya kompleks atau tidak. Sekiranya kita mempunyai corak pembinaan yang terlalu sederhana, maka usaha membuat objek pembina fleksibel kita mungkin jauh melebihi keuntungan.

Seperti biasa, kodnya terdapat di Github.