C# में डिज़ाइन पैटर्न उदाहरण सहित: A से Z तक
\n\nडिज़ाइन पैटर्न (design patterns) सॉफ्टवेयर विकास के दौरान उत्पन्न होने वाली सामान्य समस्याओं के सिद्ध समाधान हैं। ये तैयार कोड नहीं हैं, बल्कि टेम्पलेट हैं जिन्हें किसी विशिष्ट स्थिति के अनुसार अनुकूलित किया जा सकता है। C# डेवलपर के लिए, पैटर्न का ज्ञान केवल रिज्यूमे में प्लस नहीं है, बल्कि लचीली, रखरखाव योग्य और स्केलेबल आर्किटेक्चर बनाने के लिए एक आवश्यकता है।
\n\nइस लेख में, हम GoF (Gang of Four) वर्गीकरण के अनुसार पैटर्न के तीन मुख्य समूहों को समझेंगे: क्रिएशनल, स्ट्रक्चरल और बिहेवियरल। प्रत्येक पैटर्न को C# (.NET) में एक व्यावहारिक उदाहरण के साथ समझाया जाएगा।
\n\nक्रिएशनल पैटर्न (Creational Patterns)
\n\nये पैटर्न ऑब्जेक्ट निर्माण की प्रक्रिया को नियंत्रित करते हैं, सिस्टम को उनके निर्माण के तरीके से स्वतंत्र बनाते हैं। आइए दो सबसे लोकप्रिय पैटर्न देखें।
\n\nसिंगलटन (Singleton)
\nयह सुनिश्चित करता है कि क्लास का केवल एक इंस्टेंस हो, और उस तक वैश्विक पहुंच प्रदान करता है। C# में मल्टी-थ्रेडेड वातावरण में सुरक्षित कार्य के लिए Lazy<T> का उपयोग किया जाता है।
public sealed class Logger\n{\n private static readonly Lazy<Logger> _instance = \n new Lazy<Logger>(() => new Logger());\n\n public static Logger Instance => _instance.Value;\n\n private Logger() { }\n\n public void Log(string message)\n {\n Console.WriteLine($"[{DateTime.Now}] {message}");\n }\n}\n\n// उपयोग\nLogger.Instance.Log("एप्लिकेशन शुरू हुआ");\n\nफैक्टरी मेथड (Factory Method)
\nयह ऑब्जेक्ट बनाने के लिए एक इंटरफ़ेस परिभाषित करता है, लेकिन सबक्लास को बनाए जाने वाले ऑब्जेक्ट के प्रकार को बदलने की अनुमति देता है। यह उन स्थितियों के लिए उपयुक्त है जहां ऑब्जेक्ट का प्रकार पहले से ज्ञात नहीं है।
\n\npublic interface ITransport\n{\n void Deliver();\n}\n\npublic class Truck : ITransport\n{\n public void Deliver() => Console.WriteLine("जमीन के रास्ते डिलीवरी");\n}\n\npublic class Ship : ITransport\n{\n public void Deliver() => Console.WriteLine("समुद्र के रास्ते डिलीवरी");\n}\n\npublic abstract class Logistics\n{\n public abstract ITransport CreateTransport();\n\n public void PlanDelivery()\n {\n var transport = CreateTransport();\n transport.Deliver();\n }\n}\n\npublic class RoadLogistics : Logistics\n{\n public override ITransport CreateTransport() => new Truck();\n}\n\n// उपयोग\nLogistics logistics = new RoadLogistics();\nlogistics.PlanDelivery(); // आउटपुट: जमीन के रास्ते डिलीवरी\n\nस्ट्रक्चरल पैटर्न (Structural Patterns)
\n\nये ऑब्जेक्ट्स के बीच संबंध बनाने के तरीकों को परिभाषित करते हैं, जो आर्किटेक्चर में लचीलापन और दक्षता सुनिश्चित करते हैं।
\n\nअडैप्टर (Adapter)
\nयह असंगत इंटरफ़ेस वाले ऑब्जेक्ट्स को एक साथ काम करने की अनुमति देता है। इसका उपयोग अक्सर पुराने कोड या तृतीय-पक्ष लाइब्रेरीज़ के साथ एकीकरण करते समय किया जाता है।
\n\n// लक्ष्य इंटरफ़ेस, जिसकी क्लाइंट को उम्मीद है\npublic interface IModernPrinter\n{\n void Print(string text);\n}\n\n// पुराना क्लास जिसका इंटरफ़ेस असंगत है\npublic class OldPrinter\n{\n public void PrintOldStyle(string message)\n {\n Console.WriteLine($"पुराना प्रिंटर: {message}");\n }\n}\n\n// अडैप्टर\npublic class PrinterAdapter : IModernPrinter\n{\n private readonly OldPrinter _oldPrinter;\n\n public PrinterAdapter(OldPrinter oldPrinter)\n {\n _oldPrinter = oldPrinter;\n }\n\n public void Print(string text)\n {\n _oldPrinter.PrintOldStyle(text);\n }\n}\n\n// उपयोग\nIModernPrinter printer = new PrinterAdapter(new OldPrinter());\nprinter.Print("नमस्ते, दुनिया!"); // आउटपुट: पुराना प्रिंटर: नमस्ते, दुनिया!\n\nडेकोरेटर (Decorator)
\nयह कोड को बदले बिना किसी ऑब्जेक्ट में गतिशील रूप से नई जिम्मेदारियां जोड़ता है। यह इनहेरिटेंस का एक लचीला विकल्प है।
\n\npublic interface ICoffee\n{\n double GetCost();\n string GetDescription();\n}\n\npublic class SimpleCoffee : ICoffee\n{\n