क्या किसी के पास फ्लाईवेट पैटर्न का उपयोग करने का एक विशिष्ट उदाहरण है? [बन्द है]


21

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

परिभाषा के अनुसार यह कहता है:

कुशलता से बड़ी संख्या में ठीक-ठाक वस्तुओं का समर्थन करने के लिए साझाकरण का उपयोग करें।

अगर मैं इसे सही पढ़ता हूं तो डिक्शनरी और हैशटेबल्स उड़ने के उदाहरण हो सकते हैं क्या यह सही है?

अग्रिम में धन्यवाद।


7
फ्लाईवेट पर बस थोड़ा सा किस्सा: मुझे एक बार 3 पार्टी एपीआई के साथ बड़ी एक्सेल फाइल (500k रिकॉर्ड तक, 100 कॉलम से अधिक) बनाने थे। कोशिकाओं के लिए शैली अत्यंत स्मृति गहन हो गई। इसलिए जब भी एक शैली की आवश्यकता होती है, तो एक हैशटेबल की जाँच की जाती थी यदि एक समान शैली पहले से मौजूद थी और फिर इस शैली को सिर्फ एक संदर्भ प्रदान किया गया था। इस संशोधन ने इस निर्यात को संभव बनाया। अब एक्सेल में इतना डेटा होना मेरी राय में पागलपन है। लेकिन नियंत्रकों के पास उनका विश्लेषण मैक्रोज़ था जिसे वे रखना चाहते थे।
फाल्कन

9
टिप्पणी: मुझे आशा है कि पैटर्न और OO पुस्तकें और लेख लिखने वाले लोग औसत प्रोग्रामर की वास्तविक दुनिया में आते हैं और वकील शैली अंग्रेजी का उपयोग करना बंद कर देते हैं!
NoChance

1
"मुझे एक बार बड़ी एक्सेल फाइल (500k रिकॉर्ड तक, 100 से अधिक कॉलम) बनाने थे" - कि कुछ व्यापारियों को बनाने में सक्षम होने की तुलना में बहुत अधिक नहीं है ;-)
quant_dev

इन उदाहरणों में से कई को पढ़ने के बाद मुझे लगता है कि स्मृति डेटा संपीड़न इस तकनीक को लागू करने के लिए एक निष्पादन योग्य स्थान होगा। सहायता के लिए धन्यवाद!
जेरेमी ई

GWT में टेबल सेल फ्लाईवेट हैं।
user16764

जवाबों:


19

एक उदाहरण जावा पुस्तकालयों में है। जावा में आदिम प्रकार (जैसे int, जो 32-बिट पूर्णांक है) और उनके लिए आवरण (जैसे Integer, जो लपेटता है int) है। ए intमें "बॉक्स" Integerऔर ए Integerमें अनबॉक्स करने के तरीके हैं int। रैपर आवश्यक हैं, क्योंकि आदिम प्रकार की वस्तुएं नहीं हैं और इसलिए इन्हें Mapएस में कुंजी के रूप में इस्तेमाल नहीं किया जा सकता है या रखा नहीं जा सकता है Collection

मुक्केबाजी विधि के लिए कैश का एक प्रकार के रूप में फ्लाईवेट में ऑब्जेक्ट की श्रृंखला का उपयोग करता है Integerकरने के लिए इसी रों int-128 और 127 के बीच मूल्यों उन के बाद से मान सबसे अधिक संभावना कुंजी के रूप में इस्तेमाल किया या संग्रह में रखा जा रहा हैं, यह आवंटन और स्मृति उपयोग कम कर देता है। (अगर वहाँ 5000000 Integerके मूल्य 0 के चारों ओर चल रहे हैं, कि 5000000 बार का उपयोग करता है के रूप में ज्यादा फ्लाईवेट उदाहरण का पुन: उपयोग कर रहे हैं)।



1
तो C # में स्ट्रिंग्स के लिए आंतरिक पूल फ्लाईवेट पैटर्न का एक और उदाहरण सही है?
जेरेमी ई

1
@ जेरेमी ई: हां, मेरी राय में आप स्ट्रिंग इंटर्निंग को फ्लाईवेट पैटर्न के एक एप्लिकेशन को कॉल कर सकते हैं, स्ट्रिंग्स के लिए पूरी तरह से, यह न केवल मेमोरी खपत के बारे में है, बल्कि रनटाइम दक्षता के बारे में भी है।
फाल्कन

ऑब्जेक्टिव-सी टैग किए गए पॉइंटर्स इसे चरम सीमा तक ले जाते हैं। 56 बिट तक के बॉक्सर पूर्णांक, और छह वर्णों तक के कई तार, ऑब्जेक्ट के रूप में भी आवंटित नहीं किए जाते हैं, लेकिन सभी जानकारी ऑब्जेक्ट पॉइंटर में ही पैक की जाती है।
gnasher729

9

ग्राफिक्स। आमतौर पर, एक रेखापुंज छवि (जो अधिकांश उपभोक्ता-स्तर के कंप्यूटर ग्राफिक्स की रीढ़ है) सीपीयू-सस्ती है, लेकिन मेमोरी के साथ काम करने के लिए महंगा है (जो कि ठीक है क्योंकि मेमोरी के सस्ते लेकिन सीपीयू महंगा है)। यदि उस रेखापुंज छवि को कई बार एक बड़े यूआई (विंडोज जीयूआई ऐप में आइकन से लेकर वर्ड प्रोसेसर में फ़ॉन्ट के पात्रों तक, 3 डी गेम में सतहों पर बनावट के लिए) को रेंडर करने में दोहराया जाना है, तो यह बहुत मायने रखता है छवि को एक बार मेमोरी में लोड करें, और बस बहुत ही सरल वस्तुओं का उपयोग करके इसे इंगित करें जो बनाने के लिए सस्ते हैं और खुद को बहुत सारी मेमोरी नहीं लेते हैं। एक स्प्राइट, जो केवल चित्रमय स्थान का एक बिंदु है जिस पर एक छवि प्रदर्शित की जानी चाहिए, उपयोग करने के लिए छवि का पहला पिक्सेल सिर्फ एक 3D बिंदु और एक मेमोरी पॉइंटर है। MAYBE में यह प्रयोग की जाने वाली स्प्राइट छवि फ़ाइल के हिस्से के आयाम भी शामिल हैं, या तो चित्रमय या स्मृति शब्दों में। यह जानकारी बदलने के लिए बहुत सस्ती है, स्प्राइट की छवि या स्थान को बदलने के लिए कहें, और यह हर बार एक नई छवि को लोड किए बिना किया जा सकता है, इस प्रकार अंतर्निहित प्रोग्राम के प्रदर्शन में भारी हेरफेर करने और प्रदर्शित करने के लिए उचित प्रदर्शन बढ़ाता है एक संपूर्ण UI "दृश्य" रेंडर करने के लिए उचित चित्र।


3

Characterस्मॉलटाक में एएससीआईआई-रेंज के उदाहरण फ्लाईवेट हैं।

जब आप किसी चीज़ का मूल्यांकन करते हैं Character space, तो Character class >> #value:निष्पादित होता है:

value: anInteger 
    "Answer the Character whose value is anInteger."

    anInteger > 255 ifTrue: [^self basicNew setValue: anInteger].
    ^ CharacterTable at: anInteger + 1.

वर्ग चर CharacterTableइस तरह से शुरू होता है:

initialize
    "Create the table of unique Characters, and DigitsValues."
    "Character initializeClassificationTable"

    CharacterTable ifNil: [
        "Initialize only once to ensure that byte characters are unique"
        CharacterTable := Array new: 256.
        1 to: 256 do: [:i | CharacterTable
            at: i
            put: (self basicNew setValue: i - 1)]].
    self initializeDigitValues

इसलिए जब आप एक स्ट्रिंग बनाते हैं, तो एएससीआईआई-रेंज Characterएस CharacterTableहर बार नव-निर्मित होने के बजाय आएगा ।


3

फ्लाईवेट पैटर्न का उपयोग करने का उद्देश्य अनावश्यक वस्तु की शुरुआत से बचना है और इस प्रकार अंतरिक्ष को बचाना है। GOF द्वारा परिभाषित के रूप में , एक वस्तु के दो राज्य हो सकते हैं, आंतरिक और बाहरी राज्य:

  • आंतरिक स्थिति: फ्लाईवेट में संग्रहीत होती है; इसमें फ्लाईवेइट्स के संदर्भ में स्वतंत्र होने वाली जानकारी शामिल है, जिससे यह साझा करने योग्य है।
  • बाहरी स्थिति: फ्लाईवेट के संदर्भ पर निर्भर करता है और बदलता रहता है इसलिए इसे साझा नहीं किया जा सकता। क्लाइंट ऑब्जेक्ट बाहरी राज्य को फ़्लाइवेट पर जाने के लिए ज़िम्मेदार होते हैं जब उसे इसकी आवश्यकता होती है।

यह मानते हुए कि हम एक साधारण टेक्स्ट एडिटर एप्लिकेशन विकसित करना चाहते हैं, जहां प्रत्येक कॉलम में टेक्स्ट की सभी पंक्तियाँ हों और पंक्ति में अक्षर हो सकते हैं।

यहाँ दुविधा यह है कि चरित्र वर्ग को कैसे डिज़ाइन किया जाए। char cचरित्र वर्ग के भीतर मुख्य (आंतरिक राज्य) वस्तु होना चाहिए। हालाँकि, एक चार में फ़ॉन्ट और आकार (बाहरी स्थिति) हो सकता है; इस प्रकार हमें पंक्ति (क्लाइंट) पर इसकी बाहरी स्थिति को संग्रहीत करने और आवश्यकता पड़ने पर इसे एक्सेस करने की आवश्यकता है। इस प्रयोजन के लिए, दो सूचियाँ जो फॉन्ट को स्टोर करती हैं और आकार बनाई जाती हैं।

फ्लाईवेट पैटर्न का पालन करके, चरित्र अब पुन: प्रयोज्य है और वस्तुओं को वस्तुओं की एक विशिष्ट सूची (फ्लाईवेट पूल) से संदर्भित किया जा रहा है जिसमें सभी ASCII प्रतीक ( Characterऑब्जेक्ट) शामिल हैं।

यहाँ मैं नेत्रहीन वर्णित है:

यहाँ छवि विवरण दर्ज करें

'हैलो' को प्रिंट करने के लिए, केवल 4 Characterऑब्जेक्ट्स की आवश्यकता होती है, 5. इसके बजाय फ़ॉन्ट बदलने के बाद, कोई नई ऑब्जेक्ट की आवश्यकता नहीं होती है; ध्यान दें कि यह संभव नहीं होगा, हमने वर्णनात्मक वर्ग को वर्ण वर्ग पर संग्रहीत किया है, जैसे,

class Character
{
    char c;
    int Size;
    Font font;

    ....
}

बड़े डेटासेट पर इस पैटर्न को लागू करने से एप्लिकेशन और ऑब्जेक्ट पुन: प्रयोज्य की मेमोरी जटिलता पर महत्वपूर्ण अनुकूलन होगा ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.