Builder — mobil ishlanmada quruvchi na'munasi asoslari

Muallif: IT Sectr Nashr etilgan: 2026-02-17 O'qish vaqti: 7 daq

Builder — murakkab ob'ektlarni bosqichma-bosqich yaratishga imkon beruvchi yaratuvchi na'muna. O'nlab parametrli konstruktordan farqli o'laroq, Builder ob'ektni zanjirli chaqiruvlar orqali yig'adi, ularning har biri bitta maydonni sozlaydi. Na'muna ko'plab ixtiyoriy parametrlarga ega ob'ektlar uchun ayniqsa foydalidir: tarmoq mijozining konfiguratsiyasi, ma'lumotlar bazasi sozlamalari, ogohlantirish va navigatsiya quruvchilari. Batafsil — Refactoring Guru: Builder.

Asosiy ma'lumotlar

  • Builder — jarayon va natijani ajratgan holda ob'ektlarni bosqichma-bosqich qurish
  • Fluent interface — qulay sozlash uchun set()/with() zanjirli chaqiruvlari
  • O'zgarmaslik — Builder setter talab qilmaydigan tayyor ob'ekt yaratadi
  • Orqaga moslik — Builder-ga yangi maydonlar mijozlarni buzmasdan qo'shiladi
  • Kotlin DSL vs Builder — Kotlin muqobil sifatida type-safe builders taklif qiladi

Builder nima: quruvchi na'munasining mohiyati?

Builder (quruvchi) — murakkab ob'ektning qurilishini uning taqdimotidan ajratuvchi GoF yaratuvchi na'munasi. Xuddi shu qurish jarayoni turli xil taqdimotlarni yaratishi mumkin. Builder ob'ektda ko'plab ixtiyoriy parametrlar bo'lganda va o'n maydonli konstruktor o'qib bo'lmaydigan va moslashuvchan bo'lmaganda foydalidir. Na'muna shuningdek Telescoping Constructor muammosini ham hal qiladi — konstruktorning ortiqcha yuklanishlari soni eksponensial ravishda o'sadigan anti-na'muna.

Builder tuzilishi — asosiy sinf maydonlarini nusxalovchi maydonlarga ega ichki statik Builder sinfini o'z ichiga oladi. Har bir set-metod fluent chaining uchun Builder (this) qaytaradi. Yakuniy build() metodi maqsadli ob'ektni yaratadi, maydon qiymatlarini xususiy konstruktorga uzatadi. Asosiy sinf Builder qabul qiluvchi xususiy konstruktorga ega. Mijoz: Object.builder().setField1(val1).setField2(val2).build().

Builder qachon ishlatiladi — faqat 2-3 tasi majburiy bo'lgan 5+ maydonli ob'ektlar. Konfiguratsiya ob'ektlari (RequestConfig, DatabaseConfig). Yaratishda murakkab validatsiya mantiqiga ega ob'ektlar. Yaratilgandan keyin o'zgarmas (immutable) bo'lishi kerak bo'lgan ob'ektlar. Android-da Builder SDK-da faol qo'llaniladi: AlertDialog.Builder, Retrofit.Builder, OkHttpClient.Builder, NotificationCompat.Builder.

Kotlin-da Builder: klassik va DSL tatbiqi

Kotlin Builder ikkita yondashuvga ega: klassik Java-style Builder (ichki sinf orqali) va Kotlin-style DSL builder (receiver bilan lambda orqali). Java-style Builder Android mosligi va Java kodi bilan ishlashda afzal ko'riladi. DSL builder — idiomatik Kotlin usuli: funksiya lambda qabul qiladi, uning ichida this — Builder konteksti, bu erda maydonlarni to'g'ridan-to'g'ri tayinlash mumkin.

kotlin
// Klassik Builder
data class HttpConfig private constructor(
    val baseUrl: String,
    val timeout: Long = 30_000,
    val retries: Int = 3,
    val headers: Map<String, String> = emptyMap()
) {
    class Builder {
        private var baseUrl: String = ""
        private var timeout: Long = 30_000
        private var retries: Int = 3
        private var headers: MutableMap<String, String> = mutableMapOf()

        fun baseUrl(url: String) = apply { this.baseUrl = url }
        fun timeout(ms: Long) = apply { this.timeout = ms }
        fun retries(n: Int) = apply { this.retries = n }
        fun header(key: String, value: String) = apply { headers[key] = value }

        fun build(): HttpConfig {
            require(baseUrl.isNotBlank()) { "baseUrl is required" }
            return HttpConfig(baseUrl, timeout, retries, headers)
        }
    }
}

// Foydalanish
val config = HttpConfig.Builder()
    .baseUrl("https://api.example.com")
    .timeout(15_000)
    .header("Authorization", "Bearer token")
    .build()

Kotlin DSL builder — ichki sinfsiz muqobil. Builder-funksiya quruvchi-ob'ekt kontekstida lambda qabul qiladi. Bu Kotlin uchun idiomatik va write-maydonlarini talab qilmaydi. DSL builders Ktor Client, kotlinx.serialization, Compose (Modifier) da faol qo'llaniladi. DSL builder Java bilan mos kelmaydi va Java API-si bo'lgan kutubxonalar uchun mos emas.

Swift-da Builder: result builders va zanjirlar

Swift Builder — Swift o'rnatilgan Builder na'munasiga ega emas, ammo fluent interface Self qaytaruvchi metodlar orqali osonlik bilan tatbiq etiladi. Har bir metod xususiyatni sozlaydi va self qaytaradi. Kotlin-dan farqli o'laroq, Swift alohida Builder sinfini talab qilmaydi — ob'ekt yig'ish bosqichida mutable bo'lsa, uni o'zini qaytarish mumkin. Immutable ob'ektlar uchun Kotlin-ga o'xshash ichki Builder sinfi ishlatiladi.

swift
struct NetworkRequest {
    let url: String
    let method: HTTPMethod
    let headers: [String: String]
    let body: Data?
    let timeout: TimeInterval

    final class Builder {
        private var url: String = ""
        private var method: HTTPMethod = .get
        private var headers: [String: String] = [:]
        private var body: Data? = nil
        private var timeout: TimeInterval = 30

        func withURL(_: String) -> Self { /* self */ }
        func withMethod(_: HTTPMethod) -> Self { /* self */ }
        func withHeader(key: String, value: String) -> Self { /* self */ }
        func withBody(_: Data) -> Self { /* self */ }
        func withTimeout(_: TimeInterval) -> Self { /* self */ }

        func build() throws -> NetworkRequest {
            guard !url.isEmpty else { throw BuilderError.missingURL }
            return NetworkRequest(
                url: url, method: method, headers: headers,
                body: body, timeout: timeout
            )
        }
    }
}

Result Builders — Swift 5.4 @resultBuilder ni taqdim etdi — tuzilmalarni deklarativ qurish uchun til mexanizmi. SwiftUI, AttributedString, SceneBuilder result builders dan foydalanadi. Bu klassik Builder-ga alternativ: set-metodlar zanjiri o'rniga result builder kompilyator massiv yoki daraxtda to'playdigan elementlar bilan kod blokidan foydalanadi. SwiftUI-dagi @ViewBuilder — eng mashhur misol: body ichida if, switch, ForEach yozish mumkin va kompilyator shartlardan View quradi.

Builder vs Telescoping Constructor: yondashuvlarni solishtirish

Telescoping Constructor — sinf turli xil parametr to'plamlari bilan bir nechta ortiqcha yuklangan konstruktorlarga ega bo'lgan anti-na'muna. Masalan, uchta konstruktor: HttpConfig(url), HttpConfig(url, timeout), HttpConfig(url, timeout, retries). Parametrlarning o'sishi bilan konstruktorlar soni eksponensial ravishda o'sadi — n ixtiyoriy maydon uchun n! kombinatsiya kerak. Builder bu muammoni faqat kerakli maydonlarni sozlashga imkon berib hal qiladi.

XususiyatTelescoping ConstructorBuilderKotlin named args
Kod miqdoriEksponensial o'sishChiziqli o'sishMinimal
O'qishlilikPast (qaysi parametr?)Yuqori (metod + nom)Yuqori (nom = qiymat)
O'zgarmaslikImmutableImmutableImmutable
Java mosligiTo'liqTo'liqYo'q (faqat Kotlin)
ValidatsiyaHar bir konstruktordabuild() da — bir martainit() da

Kotlin named arguments + default values — sof Kotlin loyihalarida Builder-ga nafis alternativ. Konstruktor parametrlari standart qiymatlarga ega, mijoz faqat keraklilarini uzatadi: HttpConfig(baseUrl = url, timeout = 15_000). Kamchilik — majburiy maydonlarni kompilyatsiya bosqichida tekshira olmaslik. Builder majburiy maydonlarni Builder konstruktori orqali beradi (baseUrl majburiy). Java kutubxonalari uchun Builder de-fakto standart bo'lib qoladi.

Android SDK-da Builder: AlertDialog, Retrofit, OkHttp

Android SDK-da Builder — standart kutubxonadagi eng keng tarqalgan na'munalardan biri. AlertDialog.Builder: new AlertDialog.Builder(context).setTitle().setMessage().setPositiveButton().create(). Retrofit.Builder: new Retrofit.Builder().baseUrl().addConverterFactory().build(). OkHttpClient.Builder: new OkHttpClient.Builder().connectTimeout().addInterceptor().build(). NotificationCompat.Builder: setContentTitle().setContentText().setSmallIcon().build().

Nega Google Builder dan foydalanadi — orqaga moslik. Builder-ga yangi metod qo'shish mavjud kodni buzmaydi. Agar Google 20 parametrli konstruktor ishlatganida, har bir yangi maydon yangi ortiqcha yuklashni talab qilardi. Builder yillar davomida breaking changes holda set-metodlar qo'shish imkonini beradi. Masalan, NotificationCompat.Builder Android 11 da setBubbleMetadata() qo'shdi, mavjud kodga ta'sir qilmasdan.

Kotlin kutubxonalarida Builder — Ktor (HttpClientBuilder), Coil (ImageRequest.Builder), Room (Room.databaseBuilder()), Navigation (NavOptionsBuilder). Kotlin loyihalarida Builder ko'pincha DSL bilan birlashtiriladi: Room.databaseBuilder(context, AppDatabase.class, "db").fallbackToDestructiveMigration().build(). Na'muna orqaga moslik va Java interopi muhim bo'lgan jamoat API-lari uchun dolzarbligicha qoladi.

Tez-tez so'raladigan savollar

Builder qachon ortiqcha?

Builder 1-3 maydonli ob'ektlar uchun ortiqcha — oddiy konstruktor yoki data class tushunarliroq. Shuningdek, Java interopi bo'lmagan Kotlin loyihalarida ortiqcha, bu erda named arguments + default values xuddi shu vazifani soddaroq hal qiladi. Builder 5+ maydon, murakkab validatsiya yoki named arguments mavjud bo'lmagan Java API uchun asoslanadi.

Builder Factory-dan nimasi bilan farq qiladi?

Builder bitta murakkab ob'ektni bosqichma-bosqich (maydonlarni sozlash) yaratadi, Factory ob'ektni turi yoki parametrlari bo'yicha to'liq yaratadi. Builder «qanday yig'ish?» degan savolga javob beradi, Factory — «nimani yaratish?». Builder ko'pincha Factory bilan birlashtiriladi: Factory turni tanlaydi, Builder maydonlarni sozlaydi.

SwiftUI da Builder kerakmi?

SwiftUI da Builder rolini result builders (@ViewBuilder, @SceneBuilder) va View modifikatorlari (.font(), .padding()) bajaradi. Klassik Builder talab qilinmaydi, chunki SwiftUI deklarativ yondashuv va fluent modifiers dan foydalanadi. UIKit komponentlari uchun Builder foydali: UIAlertController, URLRequest, NSAttributedString.

Builder ni thread-safe qanday qilish kerak?

Builder odatda thread-safe talab qilmaydi, chunki ob'ektni yig'ish uchun bitta oqimda ishlatiladi. Agar Builder ko'p oqimli muhitda ishlatilsa (kamdan-kam hol), har bir set-metod va build() ni sinxronizatsiya qiling. Alternativ — Immutable Builder: har bir set-metod o'zgartirilgan maydon bilan yangi Builder nusxasini qaytaradi.

Nega Retrofit Builder dan foydalanadi, DI emas?

Retrofit.Builder — DI konteynersiz ishlashi kerak bo'lgan kutubxonaning jamoat API-si. Builder konfiguratsiya moslashuvchanligini (baseUrl, konvertorlar, interceptors, maxsus call adapterlar) Dagger yoki boshqa DI ga bog'liq bo'lmasdan beradi. Ilova ichida DI Retrofit ni Builder orqali bir marta yaratishi mumkin, ammo Builder o'zi Retrofit ning jamoat API si qismi bo'lib qoladi.

Xulosa

  • Builder — fluent interface bilan ob'ektlarni bosqichma-bosqich qurish
  • Kotlin Builder — klassik (ichki sinf) va DSL (receiver bilan lambda)
  • Swift Builder — ichki sinf yoki deklarativ kod uchun @resultBuilder
  • O'zgarmaslik — Builder xususiy konstruktor orqali immutable ob'ektlar yaratadi
  • Android SDK — AlertDialog, Retrofit, OkHttp, NotificationCompat — sanoat standarti
  • Orqaga moslik — Builder-ga maydon qo'shish mavjud kodni buzmaydi
  • Kotlin alternativi — named arguments + default values sof Kotlin loyihalari uchun soddaroq

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing