15

मैं डिजाइन पैटर्न पर गहन अध्ययन कर रहा हूं, और मैं प्रोटोटाइप में आया, जिसे मैंने वास्तव में पहले अध्ययन नहीं किया था। मैंने वेब और कई पुस्तकों की खोज की है, और प्रोटोटाइप का वास्तव में एक अच्छा उदाहरण नहीं है जो पाया जा सकता है कि यह क्लोन नहीं है। प्रोटोटाइप का डिज़ाइन पैटर्न मूल रूप से जावा और सी # की क्लोन के रूप में एक भाषा सुविधा है?प्रोटोटाइप डिजाइन पैटर्न वास्तव में बस क्लोन है?

+3

पैटर्न भाषा स्वतंत्र पृथक्करण हैं, क्लोन एक विशिष्ट भाषा मुहावरे है। यह कहना सही होगा कि प्रोटोटाइप पैटर्न क्लोन मुहावरे का एक सामान्यीकरण है, या क्लोन प्रोटोटाइप का एक भाषा विशिष्ट मुहावरे है, लेकिन यह एक भाषा मुहावरे को बारीकी से बांधने में एक त्रुटि होगी। –

उत्तर

18

प्रोटोटाइप पैटर्न क्लोन से कहीं अधिक है। क्लोन अर्थशास्त्र व्यापक हैं, जिसका अर्थ है कि एक ऑब्जेक्ट इंस्टेंस के स्केलर्स/वैल्यू फ़ील्ड्स को एक नए इंस्टेंस में डुप्लिकेट किया गया है, जैसे कि उनके समकक्ष राज्य हैं लेकिन स्मृति में अलग-अलग स्थानों पर कब्जा करते हैं। क्लोन का इस्तेमाल कई अलग-अलग ज़रूरतों को पूरा करने के लिए किया जा सकता है।

प्रोटोटाइप पैटर्न विशेष रूप से ऑब्जेक्ट उपयोग से ऑब्जेक्ट निर्माण को अलग करने की बड़ी समस्या को हल करने में क्लोन को शामिल करता है। प्रोटोटाइप अर्थशास्त्र बताता है कि आवश्यक व्यवहार की एक नई वस्तु बनाने के लिए केवल (या कम से कम समर्थित/पसंदीदा) विधि प्रोटोटाइप उदाहरण के रूप में जाना जाने वाला एक विशेष उदाहरण क्लोन करना है। ये प्रोटोटाइप उदाहरण प्रोटोटाइप फैक्ट्री में रह सकते हैं, जिसे प्रोटोटाइप उदाहरणों पर क्लोन को कॉल करके नए उदाहरण बनाने के लिए लागू किया गया है। प्रोटोटाइप उदाहरण निर्भरता इंजेक्शन के माध्यम से शुरू किया जा सकता है। इंजेक्शन कोड एकमात्र कोड है जिसे प्रोटोटाइप उदाहरणों को बनाने के तरीके की आवश्यकता होती है, और यह प्रभावी रूप से असली फैक्ट्री कोड बन जाता है।

उम्मीद है कि निम्न उदाहरण कारखाने वर्ग पैटर्न की जड़ को स्पष्ट करता है:

public class PrototypeWidgetFactory : IWidgetFactory 
{ 
    public PrototypeWidgetFactory(PrototypeWidget scenarioA, PrototypeWidget scenarioB, PrototypeWidget scenarioC) 
    { 
    _scenarioA = scenarioA; 
    _scenarioB = scenarioB; 
    _scenarioC = scenarioC; 
    } 

    public Widget GetForScenarioA() { return _scenarioA.Clone(); } 
    public Widget GetForScenarioB() { return _scenarioB.Clone(); } 
    public Widget GetForScenarioC() { return _scenarioC.Clone(); } 

    private PrototypeWidgetFactory _scenarioA; 
    private PrototypeWidgetFactory _scenarioB; 
    private PrototypeWidgetFactory _scenarioC; 
} 

इस कारखाने का एक उदाहरण जहाँ भी IWidgetFactory की जरूरत है पारित किया जा सकता। लाभ यह है कि आपको प्रत्येक व्यवहार के लिए विभिन्न फैक्ट्री कक्षाओं के समूह की आवश्यकता नहीं है। वास्तव में, कुछ प्रकार के व्यवहार के लिए, आपको अलग-अलग वर्गों के समूह की भी आवश्यकता नहीं होती है यदि आप केवल उसी प्रकार के उदाहरण इंजेक्ट करते हैं जो प्रोटोटाइप फैक्ट्री में अलग-अलग शुरू होते हैं। इस मामले में, लाभ यह भी अधिक है कि एपीआई छोटे वर्गों के समूह के साथ फूट नहीं पड़ता है जो ज्यादा नहीं करते हैं।

दोष यह है कि इंजेक्शन कोड को प्रोटोटाइप बनाने के तरीके को जानने की आवश्यकता है। प्रोटोटाइप बनाने में बहुत जटिल तर्क शामिल होने पर यह भंगुर है।

(नोट: प्रोटोटाइप पैटर्न की आवश्यकता नहीं है कि प्रोटोटाइप फैक्ट्री पर सभी विधियां एक ही प्रकार की वापसी करें। मैंने अभी उदाहरण केवल विजेट को वापस कर दिया है क्योंकि यह विशेष व्यवहार के लिए ऑब्जेक्ट्स बनाने के लिए प्रोटोटाइप का उपयोग करने का अधिक लाभ दिखाता है। ऑब्जेक्ट्स एक प्रकार के होते हैं लेकिन अलग-अलग शुरू होते हैं।)

public class PrototypeDomainFactory : IDomainFactory 
{ 
    public PrototypeDomainFactory(PrototypePerson personPrototype, PrototypeCompany companyPrototype, PrototypeWidget widgetPrototype) 
    { 
    _personPrototype = personPrototype; 
    _companyPrototype = companyPrototype; 
    _widgetPrototype = widgetPrototype; 
    } 

    public Person GetPerson() { return _personPrototype.Clone(); } 
    public Company GetCompany() { return _companyPrototype.Clone(); } 
    public Widget GetWidget() { return _widgetPrototype.Clone(); } 

    private PrototypePerson _personPrototype; 
    private PrototypeCompany _companyPrototype; 
    private PrototypeWidget _widgetPrototype; 
} 
0

क्लोन() निश्चित रूप से इसका हिस्सा है। मुझे लगता है कि पैटर्न वस्तुओं को इकट्ठा करने के तरीकों के बारे में भी बात करता है, उनके माध्यम से पुन: प्रयास करता है, और क्लोन करने के लिए सही ढूंढता है। आपको वस्तुओं को शुरू करने के लिए भी सेट अप करना होगा।

4

सॉर्टा। Clone() प्रोटोटाइप प्रयोजनों के लिए आप जो कुछ भी चाहते हैं, वह करता है, लेकिन यदि आपको आवश्यकता हो तो आप पैटर्न के साथ और भी आगे जा सकते हैं। Steve Yegge's deep (and lengthy!) explanation देखें, या जावास्क्रिप्ट ऑब्जेक्ट मॉडल का अध्ययन करें।

+1

यह प्रोटोटाइप नहीं है - (हालांकि यह निश्चित रूप से संबंधित है) - वह इसे गुण पैटर्न कह रहा है। जावास्क्रिप्ट में, इस शब्द का वर्णन करने के लिए "प्रोटोटाइप" शब्द का उपयोग किया जाता है, और क्लोनिंग निश्चित रूप से शामिल है, लेकिन मैं अब भी उनके बारे में अलग-अलग चीजों के बारे में सोचता हूं। गोफ में प्रोटोटाइप गतिशील गुणों के विचार के बारे में बात नहीं करता है। –

+0

यह एक उचित बिंदु है।मैंने हमेशा प्रोटोटाइप के बारे में सोचा है जैसे कि गतिशील गुणों और पुनरावृत्ति जैसी चीजें शामिल हैं, सिर्फ इसलिए कि अगर यह * मूल रूप से क्लोन() नहीं है, और यह लंगड़ा लगता है। –

+0

वाह, उस ब्लॉग प्रविष्टि को पोस्ट करने के लिए धन्यवाद। बहुत अच्छा पढ़ा। मैंने इसे पढ़ने से बहुत कुछ सीखा। मैं मानता हूं कि यह गोफ बुक में वर्णित प्रोटोटाइप पैटर्न नहीं है। –

संबंधित मुद्दे