Sobes.tech
Middle

Πώς να αφαιρέσετε τους τέσσερις κατασκευαστές στην προσαρμοσμένη προβολή (CustomView);

sobes.tech AI

Απάντηση από AI

Μπορείτε να χρησιμοποιήσετε τη μέθοδο εργοστασίου ή το μοτίβο builder αντί να χρησιμοποιείτε απευθείας τους κατασκευαστές.

  • Μέθοδος εργοστασίου: Επιτρέπει τη δημιουργία αντιγράφων της προβολής, απομακρύνει τη διαδικασία δημιουργίας και κρύβει τη λογική επιλογής του κατάλληλου κατασκευαστή.

    class MyCustomView private constructor(
        context: Context,
        attrs: AttributeSet?,
        defStyleAttr: Int,
        defStyleRes: Int
    ) : View(context, attrs, defStyleAttr, defStyleRes) {
    
        // Ιδιωτικός κατασκευαστής για την επιβολή της χρήσης μεθόδων εργοστασίου
    
        companion object {
            fun createDefault(context: Context): MyCustomView {
                // Λογική αρχικοποίησης για τον προεπιλεγμένο κατασκευαστή
                return MyCustomView(context, null, 0, 0)
            }
    
            fun createFromAttrs(context: Context, attrs: AttributeSet?): MyCustomView {
                // Λογική αρχικοποίησης με χαρακτηριστικά
                return MyCustomView(context, attrs, 0, 0)
            }
    
            // Επιπλέον μέθοδοι εργοστασίου για άλλους συνδυασμούς κατασκευαστών
        }
    }
    
  • Μοτίβο builder: Είναι χρήσιμο όταν υπάρχουν πολλοί κατασκευαστές ή έχουν πολλαπλές προαιρετικές παραμέτρους. Επιτρέπει τη δημιουργία του αντικειμένου βήμα προς βήμα.

    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) {
    
        // Ιδιωτικός κατασκευαστής
    
        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 {
                // Λογική δημιουργίας και αρχικοποίησης της προβολής βάσει των παραμέτρων
                return MyCustomView(context, attrs, defStyleAttr, defStyleRes)
            }
        }
    }
    
    // Χρήση του builder
    val myView = MyCustomView.Builder(context)
        .setAttrs(attrs)
        .build()
    

Η επιλογή μεταξύ μεθόδου εργοστασίου και μοτίβου builder εξαρτάται από τη δυσκολία της αρχικοποίησης της προβολής. Για απλούστερες περιπτώσεις, αρκούν οι μέθοδοι εργοστασίου. Για πιο πολύπλοκες με πολλές επιλογές, προτιμάται το μοτίβο builder.