Rust में डिज़ाइन पैटर्न उदाहरण सहित: A से Z तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Rust में डिज़ाइन पैटर्न: सिद्धांत से व्यवहार तक

\n\n

डिज़ाइन पैटर्न सॉफ्टवेयर विकास में सामान्य समस्याओं के सिद्ध समाधान हैं। Rust में, इसकी अनूठी स्वामित्व प्रणाली (ownership) और शास्त्रीय OOP की अनुपस्थिति के कारण, कई शास्त्रीय पैटर्न एक नया अर्थ लेते हैं। इस लेख में, हम चार प्रमुख पैटर्न: Singleton, Factory, Builder और Strategy को देखेंगे, जो मुहावरेदार Rust के अनुकूल बनाए गए हैं।

\n\n

1. Rust में Singleton (एकल)

\n\n

Rust में सामान्य अर्थों में कोई वैश्विक स्थैतिक चर नहीं हैं। हालाँकि, Singleton को lazy_static या OnceCell के माध्यम से कार्यान्वित किया जा सकता है। आइए std::sync::OnceLock (Rust 1.70 से उपलब्ध) के साथ एक उदाहरण देखें।

\n\n

OnceLock के साथ कार्यान्वयन

\n\n
use std::sync::OnceLock;\n\nstatic CONFIG: OnceLock<Config> = OnceLock::new();\n\n#[derive(Debug)]\nstruct Config {\n    db_url: String,\n    port: u16,\n}\n\nfn get_config() -> &'static Config {\n    CONFIG.get_or_init(|| {\n        Config {\n            db_url: String::from("postgres://localhost"),\n            port: 5432,\n        }\n    })\n}\n\nfn main() {\n    let cfg = get_config();\n    println!("{:?}", cfg);\n}
\n\n

मुख्य बिंदु: OnceLock एकल आरंभीकरण और थ्रेड-सुरक्षा सुनिश्चित करता है। यह Rust के लिए मुहावरेदार तरीका है।

\n\n

2. ट्रेट्स के माध्यम से Factory (फैक्टरी)

\n\n

Rust में Factory पैटर्न ट्रेट्स का उपयोग करके अच्छी तरह से कार्यान्वित किया जाता है। हमें अमूर्त वर्गों की आवश्यकता नहीं है - ट्रेट के माध्यम से एक इंटरफ़ेस परिभाषित करना पर्याप्त है।

\n\n

उदाहरण: परिवहन साधनों का निर्माण

\n\n
trait Transport {\n    fn deliver(&self);\n}\n\nstruct Truck;\nimpl Transport for Truck {\n    fn deliver(&self) {\n        println!("ट्रक द्वारा जमीन पर डिलीवरी");\n    }\n}\n\nstruct Ship;\nimpl Transport for Ship {\n    fn deliver(&self) {\n        println!("जहाज द्वारा समुद्र में डिलीवरी");\n    }\n}\n\nstruct LogisticsFactory;\n\nimpl LogisticsFactory {\n    fn create_transport(route_type: &str) -> Box<dyn Transport> {\n        match route_type {\n            "land" => Box::new(Truck),\n            "sea" => Box::new(Ship),\n            _ => panic!("अज्ञात मार्ग प्रकार"),\n        }\n    }\n}\n\nfn main() {\n    let transport = LogisticsFactory::create_transport("sea");\n    transport.deliver();\n}
\n\n

लाभ: Rust को विरासत की आवश्यकता नहीं है - बहुरूपता ट्रेट्स और Box<dyn Trait> के माध्यम से प्राप्त की जाती है।

\n\n

3. टाइप की गई श्रृंखला के साथ Builder (बिल्डर)

\n\n

Rust में Builder का व्यापक रूप से उपयोग किया जाता है, विशेष रूप से कई वैकल्पिक पैरामीटर वाली संरचनाओं के लिए। हम इसे &mut Self लौटाने वाली टाइप की गई विधि श्रृंखला के साथ कार्यान्वित करते हैं।

\n\n

उदाहरण: HTTP अनुरोध बनाना

\n\n
#[derive(Debug, Default)]\nstruct HttpRequest {\n    url: String,\n    method: String,\n    headers: Vec<(String, String)>,\n    body: Option<String>,\n}\n\nstruct HttpRequestBuilder {\n    request: HttpRequest,\n}\n\nimpl HttpRequestBuilder {\n    fn new(url: &str) -> Self {\n        HttpRequestBuilder {\n            request: HttpRequest {\n                url: url.to_string(),\n                method: "GET".to_string(),\n                ..Default::default()\n            },\n        }\n    }\n\n    fn method(&mut self, method: &str) -> &mut Self {\n        self.request.method = method.to_string();\n        self\n    }\n\n    fn header(&mut self, key: &str, value: &str) -> &mut Self {\n        self.request.headers.push((key.to_string(), value.to_string()));\n        self\n    }\n\n    fn body(&mut self, body: &str) -> &mut Self {\n        self.request.body = Some(body.to_string());\n        self\n    }\n\n    fn build(&self) -> HttpRequest {\n        // यहाँ सत्यापन जोड़ा जा सकता है\n        HttpRequest { ..self.request.clone() }\n    }\n}\n\nfn ma                

ब्लॉग

पुस्तक अनुशंसाएँ