Go (Golang) में डिज़ाइन पैटर्न: कोड उदाहरण सहित
डिज़ाइन पैटर्न सामान्य विकास समस्याओं के सिद्ध समाधान हैं। Go में, अपने संक्षिप्त सिंटैक्स और क्लासिकल OOP की अनुपस्थिति के साथ, कई पैटर्न एक अद्वितीय कार्यान्वयन प्राप्त करते हैं। इस लेख में, हम पैटर्न के तीन समूहों पर चर्चा करेंगे: क्रिएशनल, स्ट्रक्चरल और बिहेवियरल — Golang पर व्यावहारिक उदाहरणों के साथ।
यह सामग्री शुरुआती और अनुभवी Go-डेवलपर्स दोनों के लिए उपयोगी होगी, जो स्वच्छ, पुन: प्रयोज्य और परीक्षण योग्य कोड लिखने का प्रयास कर रहे हैं।
1. क्रिएशनल पैटर्न (Creational Patterns)
क्रिएशनल पैटर्न ऑब्जेक्ट बनाने की प्रक्रिया को प्रबंधित करते हैं। Go में, जहाँ कंस्ट्रक्टर और इनहेरिटेंस नहीं हैं, उनका कार्यान्वयन विशेष रूप से सुरुचिपूर्ण है।
1.1. सिंगलटन (Singleton)
गारंटी देता है कि एक प्रकार का केवल एक इंस्टेंस है, और उस तक वैश्विक पहुँच प्रदान करता है। Go में इसे अक्सर sync.Once के माध्यम से कार्यान्वित किया जाता है।
package singleton
import ( "sync")
type Database struct { connection string}
var ( instance *Database once sync.Once)
func GetDatabase() *Database { once.Do(func() { instance = &Database{connection: "postgres://user:pass@localhost/db"} }) return instance}कब उपयोग करें: कनेक्शन पूल, कैश, लॉगर के साथ काम करते समय।
1.2. फैक्ट्री मेथड (Factory Method)
ऑब्जेक्ट बनाने के लिए एक इंटरफ़ेस परिभाषित करता है, लेकिन सबक्लास को बनाए जाने वाले ऑब्जेक्ट के प्रकार को बदलने की अनुमति देता है। Go में फैक्ट्री मेथड बस एक फंक्शन है जो एक इंटरफ़ेस लौटाता है।
package factory
import "fmt"
// Product interfacetype INotification interface { Send(message string) string}
// Concrete productstype Email struct{}
func (e *Email) Send(msg string) string { return fmt.Sprintf("Email sent: %s", msg)}
type SMS struct{}
func (s *SMS) Send(msg string) string { return fmt.Sprintf("SMS sent: %s", msg)}
// Factory functionfunc CreateNotification(notifType string) INotification { switch notifType { case "email": return &Email{} case "sms": return &SMS{} default: return nil }}कब उपयोग करें: जब बनाए जाने वाले ऑब्जेक्ट का प्रकार पहले से ज्ञात न हो।
1.3. बिल्डर (Builder)
एक जटिल ऑब्जेक्ट के निर्माण को उसके प्रतिनिधित्व से अलग करता है। Go में बिल्डर एक स्ट्रक्चर है जिसमें सेटर-मेथड होते हैं जो चेन कॉल के लिए स्वयं को लौटाते हैं।
package builder
type Pizza struct { Size string Cheese bool Pepperoni bool}
type PizzaBuilder struct { pizza Pizza}
func NewPizzaBuilder() *PizzaBuilder { return &PizzaBuilder{}}
func (b *PizzaBuilder) SetSize(size string) *PizzaBuilder { b.pizza.Size = size return b}
func (b *PizzaBuilder) AddCheese() *PizzaBuilder { b.pizza.Cheese = true return b}
func (b *PizzaBuilder) AddPepperoni() *PizzaBuilder { b.pizza.Pepperoni = true return b}
func (b *PizzaBuilder) Build() Pizza { return b.pizza}कब उपयोग करें: जब ऑब्जेक्ट में कई वैकल्पिक पैरामीटर हों।
2. स्ट्रक्चरल पैटर्न (Structural Patterns)
स्ट्रक्चरल पैटर्न ऑब्जेक्ट्स और क्लासेस को बड़ी संरचनाओं में इकट्ठा करने के तरीके परिभाषित करते हैं, लचीलापन और दक्षता बनाए रखते हुए।
2.1. अडैप्टर (Adapter)
असंगत इंटरफ़ेस वाले ऑब्जेक्ट्स को एक साथ काम करने की अनुमति देता है। Go में इसके लिए इंटरफ़ेस और रैपर स्ट्रक्चर का उपयोग किया जाता है।
package adapter
import "fmt"
// Target interfacetype USB interface { ConnectWithUSB() string}
// Adaptee (असंगत क्लास)type MemoryCard struct{}
func (m *MemoryCard) ReadFromCard() string { return "Data read from memory card"}
// Adaptertype CardReader struct { card *MemoryC