C++ में डिज़ाइन पैटर्न उदाहरण सहित: पूर्ण विश्लेषण

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

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

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

परिचय: C++ में डिज़ाइन पैटर्न की आवश्यकता क्यों है



डिज़ाइन पैटर्न (design patterns) सॉफ़्टवेयर विकास के दौरान आने वाली सामान्य समस्याओं के सिद्ध समाधान हैं। C++ में, इसकी शक्तिशाली टाइप सिस्टम, RAII और मल्टीपल इनहेरिटेंस के साथ, पैटर्न विशेष लचीलापन प्राप्त करते हैं। वे कोड को अधिक पठनीय, रखरखाव योग्य और स्केलेबल बनाने में मदद करते हैं।



इस लेख में, हम GoF (Gang of Four) कैटलॉग के 4 प्रमुख पैटर्न देखेंगे: Singleton, Factory Method, Observer और Strategy। प्रत्येक पैटर्न को C++17/20 पर एक वास्तविक कोड उदाहरण के साथ समझाया जाएगा।



क्रिएशनल पैटर्न: Singleton (सिंगलटन)



Singleton यह सुनिश्चित करता है कि एक क्लास का केवल एक ही इंस्टेंस हो, और उस तक पहुँचने के लिए एक वैश्विक बिंदु प्रदान करता है। C++ में, आधुनिक दृष्टिकोण एक लोकल स्टैटिक वेरिएबल (C++11 से thread-safe) का उपयोग करता है।



उदाहरण: एप्लिकेशन लॉगर



class Logger {public:    // कॉपी और असाइनमेंट को हटाएँ    Logger(const Logger&) = delete;    Logger& operator=(const Logger&) = delete;

static Logger& getInstance() { static Logger instance; // C++11 से thread-safe return instance; }

void log(const std::string& message) { std::lock_guard<std::mutex> lock(m_mutex); std::cout << "[LOG] " << message << std::endl; }

private: Logger() = default; // प्राइवेट कंस्ट्रक्टर ~Logger() = default; std::mutex m_mutex;};

// उपयोगint main() { Logger::getInstance().log("एप्लिकेशन शुरू हुआ"); Logger::getInstance().log("त्रुटि: फ़ाइल नहीं मिली"); return 0;}


लाभ: एकलता की गारंटी, आलसी इनिशियलाइज़ेशन, थ्रेड-सुरक्षा।
नुकसान: परीक्षण को जटिल बनाता है (वैश्विक स्थिति), एकल जिम्मेदारी के सिद्धांत का उल्लंघन करता है।



क्रिएशनल पैटर्न: Factory Method (फ़ैक्टरी मेथड)



Factory Method ऑब्जेक्ट बनाने के लिए एक इंटरफ़ेस परिभाषित करता है, लेकिन उपवर्गों को यह तय करने देता है कि किस क्लास को इंस्टेंशिएट करना है। C++ में, इसे अक्सर वर्चुअल फ़ंक्शन और स्मार्ट पॉइंटर्स के माध्यम से कार्यान्वित किया जाता है।



उदाहरण: विभिन्न प्रकार के दस्तावेज़ों का निर्माण



// एब्सट्रैक्ट प्रोडक्टclass Document {public:    virtual void open() = 0;    virtual void save() = 0;    virtual ~Document() = default;};

// कंक्रीट प्रोडक्टclass PDFDocument : public Document {public: void open() override { std::cout << "PDF खोला गया"; } void save() override { std::cout << "PDF सहेजा गया"; }};

class WordDocument : public Document {public: void open() override { std::cout << "Word खोला गया"; } void save() override { std::cout << "Word सहेजा गया"; }};

// क्रिएटर (Creator)class Application {public: virtual std::unique_ptr<Document> createDocument() = 0; virtual ~Application() = default;

void newDocument() { auto doc = createDocument(); doc->open(); // दस्तावेज़ के साथ काम करें }};

// कंक्रीट क्रिएटरclass PDFApplication : public Application {public: std::unique_ptr<Document> createDocument() override { return std::make_unique<PDFDocument>(); }};

class WordApplication : public Application {public: std::unique_ptr<Document> createDocument() override { return std::make_unique<WordDocument>(); }};

// उपयोगint main() { std::unique_ptr<Application> app = std::make_unique<PDFApplication>(); app->newDocument(); // आउटपुट: "PDF खोला गया" return 0;}


यह पैटर्न तब आदर्श होता है जब बनाए जाने वाले ऑब्जेक्ट के सटीक प्रकार पहले से ज्ञात न हों।



व्यवहारिक पैटर्न: Observer (ऑब्ज़र्वर)



ब्लॉग

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