2010-08-20 12 views
5

प्रोटोटाइप पैटर्न का उद्देश्य सृजन की लागत को कम करके किसी ऑब्जेक्ट को क्लोन करना है।प्रोटोटाइप पैटर्न को कैसे कार्यान्वित करें?

class Complex { 
    int[] nums = {1,2,3,4,5}; 
    public Complex clone() { 
     return new Complex();//this line create a new object, so is it violate the objective    of prototype ?// 
    } 
} 

class Test2 { 
    Complex c1 = new Complex(); 
    Complex makeCopy() { 
     return (Complex)c1.clone();// Is it actually create a new object ? based on the clone method in Complex class? // 
    } 
    public static void main(String[] args) { 
     Test2 tp = new Test2(); 
     Complex c2 = tp.makeCopy(); 
    } 
} 

मुझे लगता है कि यह गहरी प्रति के लिए है: यहाँ एक उदाहरण है। तो, क्या कोई इस सवाल पर मेरी मदद कर सकता है ???

+0

मैंने विकिपीडिया की इस पैटर्न की परिभाषा भी जांच की। मैं मानता हूं कि यह कोई समझ नहीं आता है (वर्गों को किसी भी तरह से तत्काल नहीं किया जा रहा है) जब तक कि आप ऑब्जेक्ट कैश का लाभ उठा रहे हों। –

उत्तर

1

सबसे पहले, यह अपने परिसर वर्ग काम कर पाने के विधि Object.clone() है कि यह कानूनी है करने के लिए संकेत मिलता है कि विधि उदाहरणों में से एक क्षेत्र के लिए क्षेत्र प्रतिलिपि बनाने के लिए के लिए Cloneable मार्कर इंटरफ़ेस को लागू करने की जरूरत है उस वर्ग का। तो फिर तुम प्रति व्यवहार निर्दिष्ट करने Object.clone() विधि ओवरराइड करने के लिए की जरूरत है:

public Complex clone(){ 
    Complex clone = (Complex)super.clone(); 
    clone.nums = this.nums; 
    return clone; 
} 
+0

मैंने सोचा था कि ओपी प्रोटोटाइप पैटर्न के पीछे सिद्धांत के बारे में पूछ रहा था, नहीं? और चाहे वह वास्तव में नई वस्तुओं को तुरंत चालू करता है या नहीं ... –

0

मैं दिया प्रति प्रोटोटाइप पैटर्न के रूप में कार्यान्वित किया जाता है उदाहरण नहीं लगता।

गलतियों मैं देख रहा हूँ कर रहे हैं:

  1. Cloneable मार्कर इंटरफ़ेस लागू नहीं किया है।
  2. ओवरराइड क्लोन विधि में "नया परिसर()" कन्स्ट्रक्टर का उपयोग करके नया उदाहरण बनाया जा रहा है। यह मामला नहीं होना चाहिए। मेरा मतलब है कि प्रोटोटाइप पैटर्न में है, हमें स्रोत की एक प्रति बनाना चाहिए, कुछ बदलाव करें और आवश्यकताओं के अनुसार क्लोन का उपयोग करें। लेकिन नया उदाहरण नहीं बनाओ। उदाहरण के निर्माण की लागत को क्लोनिंग से बचा जा सकता है, लेकिन अगर हम क्लोन विधि को ओवरराइड करते हैं और इसका उदाहरण बनाते हैं तो आप वास्तव में इसकी लागत में वृद्धि कर रहे हैं।

प्रोटोटाइप पैटर्न को समझने के लिए कुछ लिंक: क्लोन विधि के लिए

http://www.javabeat.net/tips/34-using-the-prototype-pattern-to-clone-objects.html

http://www.allapplabs.com/java_design_patterns/prototype_pattern.htm

0

जावा कार्यान्वयन वर्ग निर्माता फोन नहीं होंगे। यह स्मृति में किसी अन्य स्थान पर वर्तमान उदाहरण द्वारा कब्जा कर लिया गया स्मृति कॉपी करेगा।

इस तरह से यह वास्तव में नई वस्तु निर्माण की लागत को कम करता है।

0

आप जो कह रहे हैं वह आंशिक रूप से सही है कि प्रोटोटाइप पैटर्न का उद्देश्य क्लोनिंग और "नया" से परहेज करके ऑब्जेक्ट बनाने के लिए लागत को कम करना है।

लेकिन इसका मतलब यह नहीं है कि आप ऑब्जेक्ट क्लोन करने के लिए पैटर्न का उपयोग कर सकते हैं। अन्य महत्वपूर्ण विचार हैं

  • अन्य सभी उदाहरणों के "निर्माता" के रूप में प्रोटोटाइप ऑब्जेक्ट का उपयोग करें।

    • बनाने वस्तुओं की लागत कम करने, एक "प्रोटोटाइप वस्तु क्लोनिंग द्वारा:
    • बनाएं" लगभग "समान उदाहरणों किसी दिए गए उदाहरण, प्रोटोटाइप

    संक्षेप करने के लिए फार्म, प्रोटोटाइप का उद्देश्य के लिए है "

  • जब प्रोटोटाइप द्वारा बनाई गई वस्तु प्रोटोटाइपिकल ऑब्जेक्ट से थोड़ा अलग होगी।

नीचे एक उदाहरण विभिन्न प्रकार पेज बैनर की कि अलग-अलग हो थोड़ा

import java.awt.Dimension; 
import java.io.Serializable; 

/** 
* This class also acts as a factory for creating prototypical objects. 
*/ 
public class PageBanner implements Serializable, Cloneable { 
    private String slogan; 
    private String image; 
    private String font; 
    private Dimension dimension; 

    // have prototype banner from which to derive all other banners 
    private static final PageBanner PROTOTYPE = new PageBanner("", 
     "blank.png", "Verdana", new Dimension(600, 45)); 

    PageBanner(String slogan, String image, String font, 
     Dimension dim) { 
     this.slogan = slogan; 
     this.image = image; 
     //... other assignments 
    } 

    // getters and setters.. 

    public String toString() { 
     return new StringBuilder("PageBanner[") 
      .append("Slogan=").append(slogan) 
      .append("Image=").append(image) 
      .append("Font=").append(font) 
      .append("Dimensions=").append(dimension) 
      .toString(); 

    } 

    protected Object clone() { 
     Object cln = null; 
     try { 
     cln = super.clone(); 
     }catch(CloneNotSupportedException e) { 
     // ignore, will never happen 
     } 
     return cln; 
    } 

    /** 
    * This is the creational method that uses the prototype banner 
    * to create banners and changes it slightly (setting slogan and image) 
    */ 
    public static PageBanner createSloganBanner(String slogan, String image) { 
     PageBanner banner = (PageBanner) PROTOTYPE.clone(); 
     banner.slogan = slogan; 
     banner.image = image; 
     return banner; 
    } 

    /** 
    * Another creational method that uses the prototype banner 
    * to create banners and changes it slightly (setting image) 
    */ 
    public static PageBanner createImageBanner(String image) { 
     PageBanner banner = (PageBanner) PROTOTYPE.clone(); 
     banner.image = image; 
     return banner; 
    } 

    // similarly you can have a number of creational methods with 
    // different parameters for different types of banners that 
    // vary slightly in their properties. 

    // main... (for illustration) 
    public static void main(String[] args) { 
     // both these banners are created from same prototypical instance 
     PageBanner slogan = PageBanner.createSloganBanner(
      "Stackoverflow Rocks", "stack.png"); 
     PageBanner img = PageBanner.createImageBanner("stackBanner.png"); 
    } 
} 

ओह और अपने मामले में बनाने के लिए एक प्रोटोटाइप PageBanner उदाहरण का उपयोग करता है है, अपने प्रोटोटाइप वस्तु की क्लास Cloneable मार्कर इंटरफ़ेस को लागू किया है

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