أنماط التصميم في Kotlin مع أمثلة
أنماط التصميم هي حلول مجربة للمشكلات النمطية في تطوير البرمجيات. تساعد في إنشاء بنية مرنة وقابلة للتوسع والصيانة. في لغة Kotlin، بفضل تركيبها المختصر وإمكانياتها الوظيفية، يتم تنفيذ العديد من الأنماط الكلاسيكية بشكل أنيق. في هذه المقالة، سنشرح ثلاثة أنماط رئيسية: Singleton و Factory Method و Observer، ونعرض تنفيذها في Kotlin مع أمثلة عملية.
1. Singleton (الوحيد)
يضمن نمط Singleton وجود مثيل واحد فقط للفئة، ويوفر نقطة وصول عالمية إليه. في Kotlin، يوجد بناء مدمج لهذا — object. ينشئ هذا singleton آمن للخيوط دون كود زائد.
التنفيذ في Kotlin
أبسط طريقة لتعريف singleton هي استخدام الكلمة المفتاحية object:
object DatabaseConfig { private val url = "jdbc:postgresql://localhost:5432/mydb" private val username = "admin" private val password = "secret"
fun connect(): String { return "اتصال بـ $url باسم $username" }}
fun main() { println(DatabaseConfig.connect()) // الإخراج: اتصال بـ jdbc:postgresql://localhost:5432/mydb باسم admin}إذا كنت بحاجة إلى Singleton كلاسيكي مع منشئ خاص (مثلاً للوراثة من فئة أخرى)، استخدم companion object:
class Logger private constructor() { fun log(message: String) { println("[LOG]: $message") }
companion object { private val instance: Logger by lazy { Logger() }
fun getInstance(): Logger { return instance } }}
fun main() { val logger = Logger.getInstance() logger.log("تم تشغيل التطبيق")}ميزة النهج مع by lazy هي التهيئة البطيئة، التي تتم فقط عند أول استدعاء.
2. Factory Method (طريقة المصنع)
يحدد نمط Factory Method واجهة لإنشاء كائن، لكنه يسمح للفئات الفرعية بتغيير نوع الكائن الذي يتم إنشاؤه. في Kotlin، يتم تنفيذ هذا غالباً من خلال sealed class أو واجهات.
التنفيذ في Kotlin
لنفترض أننا نطور نظام إشعارات. لدينا أنواع مختلفة من الإشعارات: Email و SMS و Push. سننشئ مصنعاً لتوليدها.
// واجهة لجميع الإشعارات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") }}
class PushNotification : Notification { override fun send(message: String) { println("إرسال إشعار Push: $message") }}
// المصنعobject NotificationFactory { fun createNotification(type: String): Notification { return when (type.lowercase()) { "email" -> EmailNotification() "sms" -> SMSNotification() "push" -> PushNotification() else -> throw IllegalArgumentException("نوع إشعار غير معروف: $type") } }}
fun main() { val notification = NotificationFactory.createNotification("sms") notification.send("رمز التحقق الخاص بك: 1234") // الإخراج: إرسال SMS: رمز التحقق الخاص بك: 1234}إذا كان عدد الأنواع ثابتاً، فمن الأفضل استخدام sealed class لمزيد من الأمان:
sealed class NotificationType { object Email : NotificationType() object SMS : NotificationType() object Push : NotificationType()}
fun createNotification(type: NotificationType): Notificat