Sobes.tech
Middle

Maxsus ko'rinishda (CustomView) to'rt quruvchini qanday olib tashlash mumkin?

sobes.tech AI

AIdan javob

Fabrika usul yoki builder pattern ni to'g'ridan-to'g'ri konstruktorlardan foydalanish o'rniga ishlatish mumkin.

  • Fabrika usuli: Bu, ko'rinish nusxalarini yaratishga imkon beradi, yaratish jarayonini abstraktsiyalash va kerakli konstruktorni tanlash mantiqini yashirish.

    class MyCustomView private constructor(
        context: Context,
        attrs: AttributeSet?,
        defStyleAttr: Int,
        defStyleRes: Int
    ) : View(context, attrs, defStyleAttr, defStyleRes) {
    
        // Maxfiy konstruktor, fabrik metodlaridan foydalanishni majburiy qilish uchun
    
        companion object {
            fun createDefault(context: Context): MyCustomView {
                // Standart konstruktor uchun boshlang'ich mantiq
                return MyCustomView(context, null, 0, 0)
            }
    
            fun createFromAttrs(context: Context, attrs: AttributeSet?): MyCustomView {
                // atributlar bilan boshlang'ich mantiq
                return MyCustomView(context, attrs, 0, 0)
            }
    
            // Boshqa konstruktor kombinatsiyalari uchun fabrik metodlar
        }
    }
    
  • Builder pattern: Bu, agar ko'plab konstruktorlar yoki ko'p miqdordagi ixtiyoriy parametrlar bo'lsa, foydalidir. Ob'ektni bosqichma-bosqich yaratishga imkon beradi.

    class MyCustomView private constructor(
        private val context: Context,
        private val attrs: AttributeSet?,
        private val defStyleAttr: Int,
        private val defStyleRes: Int
    ) : View(context, attrs, defStyleAttr, defStyleRes) {
    
        // Maxfiy konstruktor
    
        class Builder(private val context: Context) {
            private var attrs: AttributeSet? = null
            private var defStyleAttr: Int = 0
            private var defStyleRes: Int = 0
    
            fun setAttrs(attrs: AttributeSet?) = apply { this.attrs = attrs }
            fun setDefStyleAttr(defStyleAttr: Int) = apply { this.defStyleAttr = defStyleAttr }
            fun setDefStyleRes(defStyleRes: Int) = apply { this.defStyleRes = defStyleRes }
    
            fun build(): MyCustomView {
                // Mantiqiy yaratish va boshlash
                return MyCustomView(context, attrs, defStyleAttr, defStyleRes)
            }
        }
    }
    
    // Builderdan foydalanish
    val myView = MyCustomView.Builder(context)
        .setAttrs(attrs)
        .build()
    

Fabrik metod va builder pattern o'rtasidagi tanlov, ko'rinishni boshlashning murakkabligiga bog'liq. Oddiy holatlar uchun fabrik metodlar etarli. Murakkab holatlar uchun, ko'p variantli bo'lsa, builder afzallik beradi.