कोटलिन में डिज़ाइन पैटर्न उदाहरणों के साथ: A से Z तक
\n\nडिज़ाइन पैटर्न (design patterns) सामान्य विकास समस्याओं के सिद्ध समाधान हैं। कोटलिन में, इसके संक्षिप्त सिंटैक्स और शक्तिशाली क्षमताओं (data class, object, extension functions, कोरूटीन) के कारण, कई क्लासिक पैटर्न Java की तुलना में अधिक सरल और सुरुचिपूर्ण ढंग से लागू किए जाते हैं। इस लेख में, हम क्रिएशनल से लेकर बिहेवियरल तक, वास्तविक कोड उदाहरणों के साथ कोटलिन में मुख्य पैटर्न पर चर्चा करेंगे।
\n\n1. क्रिएशनल पैटर्न (Creational)
\nये पैटर्न ऑब्जेक्ट बनाने की प्रक्रिया को प्रबंधित करते हैं, जिससे सिस्टम उन्हें बनाने के तरीके से स्वतंत्र हो जाता है।
\n\n1.1. Singleton (सिंगलटन)
\nगारंटी देता है कि क्लास का केवल एक इंस्टेंस है। कोटलिन में इसके लिए object कीवर्ड का उपयोग किया जाता है।
object DatabaseConnection {\n val connectionString: String = "jdbc:postgresql://localhost:5432/mydb"\n\n fun connect() {\n println("Connecting to $connectionString")\n }\n}\n\nfun main() {\n DatabaseConnection.connect()\n println(DatabaseConnection.connectionString)\n}\nकब उपयोग करें: कॉन्फ़िगरेशन मैनेजर, थ्रेड पूल, कैश के लिए।
\n\n1.2. Factory Method (फैक्ट्री मेथड)
\nऑब्जेक्ट बनाने के लिए एक इंटरफ़ेस परिभाषित करता है, लेकिन सबक्लास को बनाए जाने वाले ऑब्जेक्ट के प्रकार को बदलने की अनुमति देता है।
\n// अमूर्त उत्पाद\ninterface Notification {\n fun send(message: String)\n}\n\n// विशिष्ट उत्पाद\nclass EmailNotification : Notification {\n override fun send(message: String) = println("Email: $message")\n}\n\nclass SMSNotification : Notification {\n override fun send(message: String) = println("SMS: $message")\n}\n\n// फैक्ट्री\nabstract class NotificationFactory {\n abstract fun createNotification(): Notification\n\n fun notifyUser(message: String) {\n val notification = createNotification()\n notification.send(message)\n }\n}\n\nclass EmailFactory : NotificationFactory() {\n override fun createNotification(): Notification = EmailNotification()\n}\n\nclass SMSFactory : NotificationFactory() {\n override fun createNotification(): Notification = SMSNotification()\n}\n\nfun main() {\n val factory: NotificationFactory = EmailFactory()\n factory.notifyUser("Hello from Kotlin!")\n}\nकब उपयोग करें: जब बनाए जाने वाले ऑब्जेक्ट का प्रकार पहले से ज्ञात न हो।
\n\n1.3. Builder (बिल्डर)
\nजटिल ऑब्जेक्ट को चरण दर चरण बनाने की अनुमति देता है। कोटलिन में, इसे apply और नामित आर्गुमेंट के माध्यम से अच्छी तरह से लागू किया जाता है।
data class Pizza(\n val size: String,\n val cheese: Boolean = false,\n val pepperoni: Boolean = false,\n val mushrooms: Boolean = false\n) {\n // अंतर्निहित Builder\n class Builder(private val size: String) {\n private var cheese: Boolean = false\n private var pepperoni: Boolean = false\n private var mushrooms: Boolean = false\n\n fun cheese(value: Boolean) = apply { cheese = value }\n fun pepperoni(value: Boolean) = apply { pepperoni = value }\n fun mushrooms(value: Boolean) = apply { mushrooms = value }\n\n fun build() = Pizza(size, cheese, pepperoni, mushrooms)\n }\n}\n\nfun main() {\n val pizza = Pizza.Builder("Large")\n .cheese(true)\n .pepperoni(true)\n .build()\n println(pizza)\n}\nकब उपयोग करें: बड़ी संख्या में वैकल्पिक पैरामीटर होने पर।
\n\n2. स्ट्रक्चरल पैटर्न (Structural)
\nये पैटर्न क्लास और ऑब्जेक्ट को बड़ी संरचनाओं में बनाने के तरीके निर्धारित करते हैं।
\n\n2.1. Adapter (एडेप्टर)
\nअसंगत इंटरफ़ेस वाले ऑब्जेक्ट को एक साथ काम करने की अनुमति देता है। कोटलिन में, इसका उपयोग अक्सर extension functions के माध्यम से किया जाता है।
\n// पुराना इंटरफ़ेस\ninterface OldLogger {\n fun logMessage(msg: String)\n}\n\n// नया इंटरफ़ेस\ninterface NewLogger {\n fun log(level: Stri