أنماط التصميم في Kotlin: من الألف إلى الياء مع أمثلة الكود

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

أنماط التصميم في Kotlin مع أمثلة: من الألف إلى الياء



أنماط التصميم (design patterns) هي حلول مثبتة للمشكلات النمطية في التطوير. في Kotlin، بفضل تركيبها المختصر وإمكانياتها القوية (data class، object، extension functions، coroutines)، يتم تنفيذ العديد من الأنماط الكلاسيكية بشكل أبسط وأكثر أناقة مقارنة بـ Java. في هذه المقالة، سنشرح الأنماط الرئيسية في Kotlin من الأنماط الإنشائية إلى السلوكية، مع أمثلة كود واقعية.



1. الأنماط الإنشائية (Creational)

تدير هذه الأنماط عملية إنشاء الكائنات، مما يجعل النظام مستقلاً عن طريقة إنشائها.



1.1. Singleton (المفرد)

يضمن وجود مثيل واحد فقط للفئة. في Kotlin، يُستخدم الكلمة المفتاحية object لهذا الغرض.

object DatabaseConnection {    val connectionString: String = "jdbc:postgresql://localhost:5432/mydb"

fun connect() { println("Connecting to $connectionString") }}

fun main() { DatabaseConnection.connect() println(DatabaseConnection.connectionString)}

متى يُستخدم: لمديري التكوين، مجمعات الخيوط، المخازن المؤقتة.



1.2. Factory Method (طريقة المصنع)

يحدد واجهة لإنشاء كائن، لكنه يسمح للفئات الفرعية بتغيير نوع الكائن الذي يتم إنشاؤه.

// منتج مجردinterface Notification {    fun send(message: String)}

// منتجات محددةclass EmailNotification : Notification { override fun send(message: String) = println("Email: $message")}

class SMSNotification : Notification { override fun send(message: String) = println("SMS: $message")}

// مصنعabstract class NotificationFactory { abstract fun createNotification(): Notification

fun notifyUser(message: String) { val notification = createNotification() notification.send(message) }}

class EmailFactory : NotificationFactory() { override fun createNotification(): Notification = EmailNotification()}

class SMSFactory : NotificationFactory() { override fun createNotification(): Notification = SMSNotification()}

fun main() { val factory: NotificationFactory = EmailFactory() factory.notifyUser("Hello from Kotlin!")}

متى يُستخدم: عندما يكون نوع الكائنات المراد إنشاؤها غير معروف مسبقًا.



1.3. Builder (الباني)

يسمح بإنشاء كائنات معقدة خطوة بخطوة. في Kotlin، يتم تنفيذه بشكل ممتاز باستخدام apply والوسائط المسماة.

data class Pizza(    val size: String,    val cheese: Boolean = false,    val pepperoni: Boolean = false,    val mushrooms: Boolean = false) {    // باني مدمج    class Builder(private val size: String) {        private var cheese: Boolean = false        private var pepperoni: Boolean = false        private var mushrooms: Boolean = false

fun cheese(value: Boolean) = apply { cheese = value } fun pepperoni(value: Boolean) = apply { pepperoni = value } fun mushrooms(value: Boolean) = apply { mushrooms = value }

fun build() = Pizza(size, cheese, pepperoni, mushrooms) }}

fun main() { val pizza = Pizza.Builder("Large") .cheese(true) .pepperoni(true) .build() println(pizza)}

متى يُستخدم: عند وجود عدد كبير من المعاملات الاختيارية.



2. الأنماط الهيكلية (Structural)

تحدد هذه الأنماط طرق بناء الفئات والكائنات في هياكل أكبر.



2.1. Adapter (المهايئ)

يسمح للكائنات ذات الواجهات غير المتوافقة بالعمل معًا. في Kotlin، يُستخدم غالبًا من خلال extension functions.

// واجهة قديمةinterface OldLogger {    fun logMessage(msg: String)}

// واجهة جديدةinterface NewLogger { fun log(level: Stri

المدونات

توصيات الكتب