Builder — موبائل ڈویلپمنٹ میں بلڈر پیٹرن کی بنیادی باتیں

مصنف: IT Sectr اشاعت: 2026-02-17 مطالعے کا وقت: 7 منٹ

Builder — ایک تخلیقی نمونہ جو پیچیدہ اشیاء کو مرحلہ وار بنانے کی اجازت دیتا ہے۔ درجنوں پیرامیٹرز والے کنسٹرکٹر کے برعکس، Builder کالز کی زنجیر کے ذریعے آبجیکٹ کو جمع کرتا ہے، ہر ایک ایک فیلڈ کو کنفیگر کرتا ہے۔ یہ نمونہ خاص طور پر متعدد اختیاری پیرامیٹرز والی اشیاء کے لیے مفید ہے: نیٹ ورک کلائنٹ کنفیگریشن، ڈیٹابیس سیٹنگز، الرٹ اور نیویگیشن بلڈرز۔ مزید معلومات کے لیے Refactoring Guru: Builder ملاحظہ کریں۔

اہم نکات

  • Builder — عمل اور نتیجہ کو الگ کرتے ہوئے مرحلہ وار آبجیکٹ کی تعمیر
  • Fluent interface — آسان کنفیگریشن کے لیے set()/with() کالز کی زنجیر
  • ناگزیریت — Builder ایک تیار آبجیکٹ بناتا ہے جسے setters کی ضرورت نہیں
  • پسماندہ مطابقت — Builder میں نئے فیلڈز کلائنٹس کو توڑے بغیر شامل کیے جا سکتے ہیں
  • Kotlin DSL vs Builder — Kotlin متبادل کے طور پر type-safe builders فراہم کرتا ہے

Builder کیا ہے: بلڈر پیٹرن کا جوہر؟

Builder — ایک GoF تخلیقی نمونہ جو پیچیدہ آبجیکٹ کی تعمیر کو اس کی نمائندگی سے الگ کرتا ہے۔ وہی تعمیر کا عمل مختلف نمائندگیاں بنا سکتا ہے۔ Builder اس وقت مفید ہوتا ہے جب کسی آبجیکٹ کے بہت سے اختیاری پیرامیٹرز ہوں اور دس فیلڈز والا کنسٹرکٹر ناقابل مطالعہ اور غیر لچکدار ہو۔ یہ نمونہ Telescoping Constructor اینٹی پیٹرن کو بھی حل کرتا ہے، جہاں کنسٹرکٹر اوورلوڈز کی تعداد تیزی سے بڑھتی ہے۔

Builder کی ساخت میں ایک داخلی جامد Builder کلاس شامل ہے جس میں مرکزی کلاس کے فیلڈز کی عکاسی کرنے والے فیلڈز ہوتے ہیں۔ ہر set-طریقہ fluent chaining کے لیے Builder (this) لوٹاتا ہے۔ حتمی build() طریقہ فیلڈز کی قدریں پرائیویٹ کنسٹرکٹر کو دے کر ہدف آبجیکٹ بناتا ہے۔ مرکزی کلاس کا ایک پرائیویٹ کنسٹرکٹر ہے جو Builder قبول کرتا ہے۔ کلائنٹ: Object.builder().setField1(val1).setField2(val2).build().

Builder کب استعمال کریں — 5+ فیلڈز والی اشیاء جہاں صرف 2-3 لازمی ہوں۔ کنفیگریشن اشیاء (RequestConfig, DatabaseConfig)۔ تخلیق کے دوران پیچیدہ توثیقی منطق والی اشیاء۔ وہ اشیاء جو تخلیق کے بعد ناقابل تغیر (immutable) ہونی چاہئیں۔ Android میں، Builder SDK میں فعال طور پر استعمال ہوتا ہے: AlertDialog.Builder, Retrofit.Builder, OkHttpClient.Builder, NotificationCompat.Builder۔

Kotlin میں Builder: کلاسک اور DSL نفاذ

Kotlin میں Builder کے دو طریقے ہیں: کلاسک Java طرز کا Builder (نیسٹڈ کلاس کے ذریعے) اور Kotlin طرز کا DSL builder (رسیور کے ساتھ لیمبڈا کے ذریعے)۔ Java طرز کا Builder Android مطابقت اور Java کوڈ کے ساتھ استعمال کے لیے ترجیحی ہے۔ DSL builder Kotlin کا محاوراتی طریقہ ہے: ایک فنکشن لیمبڈا قبول کرتا ہے جس کے اندر this Builder سیاق و سباق ہے جہاں فیلڈز براہ راست تفویض کیے جا سکتے ہیں۔

kotlin
// کلاسک 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)
        }
    }
}

// استعمال
val config = HttpConfig.Builder()
    .baseUrl("https://api.example.com")
    .timeout(15_000)
    .header("Authorization", "Bearer token")
    .build()

Kotlin DSL builder — نیسٹڈ کلاس کے بغیر ایک متبادل۔ ایک builder فنکشن بلڈر آبجیکٹ کے سیاق و سباق میں لیمبڈا قبول کرتا ہے۔ یہ Kotlin کے لیے محاوراتی ہے اور write-فیلڈز کی ضرورت نہیں۔ DSL builders Ktor Client, kotlinx.serialization, Compose (Modifier) میں فعال طور پر استعمال ہوتے ہیں۔ DSL builder Java کے ساتھ مطابقت نہیں رکھتا اور Java API والی لائبریریوں کے لیے موزوں نہیں۔

Swift میں Builder: result builders اور زنجیریں

Swift میں Builder — Swift میں بلٹ ان Builder پیٹرن نہیں ہے، لیکن Self لوٹانے والے طریقوں کے ذریعے fluent interface آسانی سے لاگو کیا جا سکتا ہے۔ ہر طریقہ ایک خاصیت کو کنفیگر کرتا ہے اور self لوٹاتا ہے۔ Kotlin کے برعکس، Swift کو علیحدہ Builder کلاس کی ضرورت نہیں — اگر آبجیکٹ اسمبلی کے دوران mutable ہے تو آپ خود آبجیکٹ لوٹا سکتے ہیں۔ ناقابل تغیر اشیاء کے لیے، Kotlin کی طرح ایک نیسٹڈ Builder کلاس استعمال ہوتی ہے۔

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 متعارف کرایا — اعلامیاتی ساخت کی تعمیر کے لیے ایک لسانی میکانزم۔ SwiftUI, AttributedString, SceneBuilder result builders استعمال کرتے ہیں۔ یہ کلاسک Builder کا متبادل ہے: set-طریقوں کی زنجیر کے بجائے، result builder کوڈ بلاک استعمال کرتا ہے جس میں عناصر ہوتے ہیں جنہیں کمپائلر ایک صف یا درخت میں جمع کرتا ہے۔ SwiftUI میں @ViewBuilder سب سے مشہور مثال ہے: body کے اندر if, switch, ForEach لکھ سکتے ہیں، اور کمپائلر شرائط سے View بناتا ہے۔

Builder بمقابلہ Telescoping Constructor: طریقوں کا موازنہ

Telescoping Constructor — ایک اینٹی پیٹرن جہاں ایک کلاس میں پیرامیٹرز کے مختلف سیٹوں کے ساتھ متعدد اوورلوڈڈ کنسٹرکٹر ہوتے ہیں۔ مثال کے طور پر، تین کنسٹرکٹر: HttpConfig(url), HttpConfig(url, timeout), HttpConfig(url, timeout, retries)۔ جیسے جیسے پیرامیٹرز بڑھتے ہیں، کنسٹرکٹرز کی تعداد تیزی سے بڑھتی ہے — n اختیاری فیلڈز کے لیے n! مجموعے درکار ہیں۔ Builder صرف ضروری فیلڈز بتانے کی اجازت دے کر اس مسئلے کو حل کرتا ہے۔

خصوصیتTelescoping ConstructorBuilderKotlin named args
کوڈ کی مقدارتیز رفتار اضافہلکیری اضافہکم سے کم
مطالعیتکم (کون سا پیرامیٹر کیا ہے؟)اعلی (طریقہ + نام)اعلی (نام = قدر)
ناگزیریتناقابل تغیرناقابل تغیرناقابل تغیر
Java مطابقتمکملمکملکوئی نہیں (صرف Kotlin)
توثیقہر کنسٹرکٹر میںbuild() میں — ایک بارinit() میں

Kotlin named arguments + ڈیفالٹ ویلیوز — خالص Kotlin پروجیکٹس میں Builder کا ایک خوبصورت متبادل۔ کنسٹرکٹر پیرامیٹرز کی ڈیفالٹ ویلیوز ہوتی ہیں، کلائنٹ صرف ضروری چیزیں بھیجتا ہے: HttpConfig(baseUrl = url, timeout = 15_000)۔ خرابی کمپائل ٹائم پر لازمی فیلڈز کی توثیق کرنے سے قاصر ہے۔ Builder Builder کنسٹرکٹر کے ذریعے لازمی فیلڈز فراہم کرتا ہے (baseUrl لازمی ہے)۔ Java لائبریریوں کے لیے، Builder حقیقت میں معیار بنا ہوا ہے۔

Android SDK میں Builder: AlertDialog, Retrofit, OkHttp

Android SDK میں Builder — معیاری لائبریری میں سب سے عام نمونوں میں سے ایک۔ 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().

Google Builder کیوں استعمال کرتا ہے — پسماندہ مطابقت۔ Builder میں نیا طریقہ شامل کرنے سے موجودہ کوڈ نہیں ٹوٹتا۔ اگر Google 20 پیرامیٹرز والا کنسٹرکٹر استعمال کرتا، تو ہر نئے فیلڈ کو نئے اوورلوڈ کی ضرورت ہوتی۔ Builder برسوں تک breaking changes کے بغیر set-طریقے شامل کرنے کی اجازت دیتا ہے۔ مثال کے طور پر، NotificationCompat.Builder نے Android 11 میں setBubbleMetadata() شامل کیا، موجودہ کوڈ کو متاثر کیے بغیر۔

Kotlin لائبریریوں میں Builder — Ktor (HttpClientBuilder), Coil (ImageRequest.Builder), Room (Room.databaseBuilder(context, AppDatabase.class, "db").fallbackToDestructiveMigration().build()), Navigation (NavOptionsBuilder)۔ Kotlin پروجیکٹس میں، Builder اکثر DSL کے ساتھ ملایا جاتا ہے: Room.databaseBuilder(context, AppDatabase.class, "db").fallbackToDestructiveMigration().build()۔ نمونہ عوامی APIs کے لیے متعلقہ رہتا ہے جہاں پسماندہ مطابقت اور Java انٹرآپ اہم ہیں۔

اکثر پوچھے گئے سوالات

Builder کب ضرورت سے زیادہ ہے؟

Builder 1-3 فیلڈز والی اشیاء کے لیے ضرورت سے زیادہ ہے — عام کنسٹرکٹر یا data class زیادہ واضح ہے۔ Java انٹرآپ کے بغیر Kotlin پروجیکٹس میں بھی ضرورت سے زیادہ ہے، جہاں named arguments + ڈیفالٹ ویلیوز اسی کام کو آسان طریقے سے حل کرتے ہیں۔ Builder 5+ فیلڈز، پیچیدہ توثیق، یا Java APIs کے لیے جائز ہے جہاں named arguments دستیاب نہیں ہیں۔

Builder Factory سے کیسے مختلف ہے؟

Builder ایک پیچیدہ آبجیکٹ مرحلہ وار بناتا ہے (فیلڈ کنفیگریشن)، Factory ایک آبجیکٹ مکمل طور پر قسم یا پیرامیٹرز کے مطابق بناتا ہے۔ Builder سوال «کیسے جمع کریں؟» کا جواب دیتا ہے، Factory «کیا بنائیں؟» کا۔ Builder اکثر Factory کے ساتھ ملایا جاتا ہے: Factory قسم منتخب کرتا ہے، Builder فیلڈز کنفیگر کرتا ہے۔

کیا SwiftUI میں Builder ضروری ہے؟

SwiftUI میں، Builder کا کردار result builders (@ViewBuilder, @SceneBuilder) اور View موڈیفائر (.font(), .padding()) ادا کرتے ہیں۔ کلاسک Builder کی ضرورت نہیں کیونکہ SwiftUI اعلامیاتی طریقہ اور fluent modifiers استعمال کرتا ہے۔ UIKit اجزاء کے لیے، Builder مفید ہے: UIAlertController, URLRequest, NSAttributedString۔

Builder کو تھریڈ سیف کیسے بنایا جائے؟

Builder کو عام طور پر تھریڈ سیفٹی کی ضرورت نہیں ہوتی کیونکہ یہ ایک آبجیکٹ جمع کرنے کے لیے ایک تھریڈ میں استعمال ہوتا ہے۔ اگر Builder ملٹی تھریڈ ماحول (نایاب صورت) میں استعمال ہوتا ہے، تو ہر set-طریقہ اور build() کو مطابقت پذیر بنائیں۔ متبادل — Immutable Builder: ہر set-طریقہ تبدیل شدہ فیلڈ کے ساتھ ایک نیا Builder انسٹینس لوٹاتا ہے۔

Retrofit DI کے بجائے Builder کیوں استعمال کرتا ہے؟

Retrofit.Builder ایک عوامی لائبریری API ہے جسے DI کنٹینر کے بغیر کام کرنا چاہیے۔ Builder Dagger یا دیگر DI فریم ورکس پر انحصار کیے بغیر کنفیگریشن لچک (baseUrl, کنورٹرز, انٹرسیپٹرز, کسٹم کال اڈیپٹرز) فراہم کرتا ہے۔ ایپلیکیشن کے اندر، DI Builder کے ذریعے ایک بار Retrofit بنا سکتا ہے، لیکن Builder خود Retrofit کے عوامی API کا حصہ رہتا ہے۔

خلاصہ

  • Builder — fluent interface کے ساتھ مرحلہ وار آبجیکٹ کی تعمیر
  • Kotlin Builder — کلاسک (نیسٹڈ کلاس) اور DSL (رسیور کے ساتھ لیمبڈا)
  • Swift Builder — اعلامیاتی کوڈ کے لیے نیسٹڈ کلاس یا @resultBuilder
  • ناگزیریت — Builder پرائیویٹ کنسٹرکٹر کے ذریعے ناقابل تغیر اشیاء بناتا ہے
  • Android SDK — AlertDialog, Retrofit, OkHttp, NotificationCompat — صنعت کا معیار
  • پسماندہ مطابقت — Builder میں فیلڈز شامل کرنے سے موجودہ کوڈ نہیں ٹوٹتا
  • Kotlin متبادل — named arguments + ڈیفالٹ ویلیوز خالص Kotlin پروجیکٹس کے لیے آسان

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں