GoF डिजाइन पैटर्न - जो आप वास्तव में उपयोग करते हैं? [बन्द है]


16

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

  • सार कारखाना
  • फैक्टरी विधि
  • एकाकी वस्तु
  • पुल
  • मुखौटा
  • आदेश

जो आप वास्तव में अभ्यास में उपयोग करते हैं, और आप उनके लिए क्या उपयोग करते हैं?

पैटर्न की सूची चाहने वालों के लिए लिंक


7
IMHO, सवाल उपयोगी चर्चा उपज के लिए बहुत अस्पष्ट है। क्या आप प्रति पैटर्न एक जवाब या पैटर्न के संयोजन के प्रति एक उत्तर चाहते हैं?
मैके

इन पैटर्नों का उपयोग करने के कुछ कारण आपके लिए उपयोगी होंगे, अन्यथा आप केवल अवधारणाओं को सूचीबद्ध कर रहे हैं ... कल्पना से प्रश्न पूछें: "आप किस कीवर्ड का उपयोग करते हैं?" और " for, if, while...आदि" की सूची इकट्ठा करना - यह मापना मुश्किल है कि कितना व्यर्थ होगा।
ओसोडो

1
मैं Slomojo से असहमत हूं - मुझे लगता है कि यह जानना काफी आसान होगा कि कौन से कीवर्ड आमतौर पर इस्तेमाल किए जाते थे और जो किसी भाषा में नहीं थे। उदाहरण के लिए, बेस क्लास के लिए समान है।
क्रेग श्वार्ज़

1
इसे थोड़ा और संशोधित किया - उम्मीद है कि यह अब कुछ बेहतर चर्चा उत्पन्न करेगा।
क्रेग श्वार्ज़

1
वास्तव में आप किस प्रकार के फल खाते हैं? मैं यह जानने के लिए उत्सुक हूं कि आप इस प्रश्न से बाहर निकलने की क्या उम्मीद कर रहे हैं। यदि आप एक पैटर्न देखते हैं जो 3 या 4 लोगों ने उपयोग किया है, लेकिन आपने ऐसा नहीं किया है, तो क्या आप इसका उपयोग करने जा रहे हैं?
मार्की

जवाबों:


4

यहां उन लोगों की सूची दी गई है, जिनका मैंने अभ्यास किया है या देखा है:

सिंगलटन - ASP.Net में एप्लिकेशन ऑब्जेक्ट इसका एक प्रमुख उदाहरण है।

एडेप्टर - डेटाबेस से कनेक्ट करना आमतौर पर .Net सामान के मेरे क्षेत्र में कम से कम एक एडेप्टर क्लास को शामिल कर सकता है।

फैक्टरी - वस्तुओं को उत्पन्न करने के लिए सामान्य हालांकि मैंने दिन में कुछ पुराने क्लासिक एएसपी में इसे और अधिक देखा।

रणनीति - मेरे पास एक एप्लिकेशन था जो प्रत्येक प्रकार के डिवाइस के लिए मेरे पास उस वर्ग के लिए एक समान संरचना थी जिसे मैं इस पैटर्न के कार्यान्वयन पर विचार करूंगा।

मुखौटा - कुछ मायनों में यह एडेप्टर पैटर्न के समान है जो कुछ ऐसा है जो आमतौर पर कुछ प्रणालियों को एक साथ जोड़ता है।


1
सभी वैध उपयोग करता है। इसे पढ़ने वाले किसी के लिए भी - ध्यान रखें कि ये पैटर्न निश्चित रूप से इन तक सीमित नहीं हैं।
बोरिस यांकोव

5

लेखकों ने वास्तविक अनुप्रयोगों में पाए गए डिजाइनों से पैटर्न संकलित किया। कोई भी व्यक्ति संभवतः उन सभी का उपयोग नहीं करेगा, लेकिन वे सभी उपयोग किए जाते हैं।


आपने किस स्माइथको का उपयोग किया है, और किसके लिए?
क्रेग श्वार्ज़

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

3

सजाने वाला

संपादित करें : लगभग हर परियोजना में जो 'तुच्छ' अवस्था से परे होती है, एक IAction इंटरफ़ेस के साथ समाप्त होता है (विवरण भिन्न हो सकते हैं:

// Programming Language does not matter
interface IAction {
     bool operateOn(Foo* target);
     string getDisplayName(); // useful for debugging and logging
};

अगले घंटे मैं बहुत सारे छोटे, लगभग तुच्छ वर्गों को लिखने में खर्च करता हूं जो IAction को लागू करते हैं। जब संयुक्त होते हैं, तो वे बहुत शक्तिशाली और लचीले होते हैं।

उदाहरण के लिए LogAction(लिखने के लिए लॉग इन करें और IAction प्रदर्शन करें), NullAction(कुछ भी नहीं करें और सही लौटें), ActionList(IActions की एक सूची का प्रदर्शन करें, और बंडलों का Anding वापस करें)। कुछ मामलों में एक AndAction(दो कार्यों के और-इंग लौटने के लिए, शॉर्ट सर्किट या नहीं हो सकता है), OrAction, NotActionमेकअप भावना के रूप में अच्छी तरह से।

यद्यपि तकनीकी रूप से केवल उपर्युक्त उदाहरण से LogAction एक डेकोरेटर है (दूसरा ठीक 1 IAction पर काम नहीं करता है), मैं तब भी सज्जाकार पैटर्न के सामान्यीकरण पर विचार करता हूं जब मैं IActions के LogActions का एक्शनलिस्ट बनाता हूं।


आप इसका उपयोग किस लिए करते हैं?
क्रेग श्वार्ज

1
@ क्रेगस उदाहरण अनुरोध पर जोड़ा गया।
सोजेरड

यह वास्तव में डेकोरेटर और कम्पोजिट के मिश्रण की तरह दिखता है, जो ठीक है, और एक आदर्श प्रदर्शन है कि पैटर्न में कठिनाई उन्हें स्वतंत्र रूप से उपयोग करने से नहीं आती है, लेकिन उन्हें एक साथ मिलाने से होती है :)
मैथ्यू एम।

हाँ, यह एक क्लासिक है। यह कमांड के साथ कम्पोजिट परेड है। वास्तव में इस पैटन का एक नाम है: इसे "विशिष्टता" ( en.wikipedia.org/wiki/Specification_pattern ) कहा जाता है ।
मार्टिन विकमैन

2

मेरा मानना ​​है कि आप प्रश्न को अपने कोड / प्रोजेक्ट्स (कोई क्लास लाइब्रेरी और 3 पार्टी फ्रेमवर्क) में पैटर्न के उपयोग पर रोक नहीं लगा सकते।

दूसरों के रूप में, मैंने फ़ैक्टरी पैटर्न का भी सबसे अधिक उपयोग किया है । फिर

  • सिंगलटन : आजकल इतना नहीं है, लेकिन फिर भी कभी-कभी यह आवश्यक है, आमतौर पर वैश्विक कॉन्फ़िगरेशन डेटा के लिए
  • रणनीति और टेम्पलेट विधि : हमारे ऐप में विभिन्न प्रकार की गणनाओं का प्रतिनिधित्व करने के लिए अक्सर, उदाहरण के लिए
  • बिल्डर : आउटपुट ऑब्जेक्ट्स में मेनफ्रेम सिस्टम के साथ लेनदेन के परिणामों को मार्शेल करने के लिए (कुछ मामलों में इसमें टेक्स्ट पार्सिंग और बड़ी वस्तु पदानुक्रम बनाने का एक बड़ा सौदा शामिल है)
  • कमांड : मैंने इसे केवल एक बार कई साल पहले लागू किया था, लेकिन आजकल हमारे जावा प्रोजेक्ट में मैं अब और फिर हर दिन Callables का उपयोग करता हूं, जो मुझे विश्वास है कि मूल रूप से कमांड हैं

2

मैंने कई अन्य का उपयोग किया है जो पहले से ही उल्लेख किया गया है (सिंगलटन, फैक्टरी, बिल्डर, कमांड, रणनीति, आदि ...)

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

/**
 * Flyweight class representing OCR digits.
 * 
 * @author matt
 *
 */
public class Digit {
    /** Static flyweight map containing Digits which have been encountered. **/
    private static Map digits = new HashMap();

    /** The block of text representing Digit. **/
    private String blockRep = null;

    /** A map representing acceptable blocks of characters and the string representation of their
     * numerical equivalents.
     */
    public static final Map VALID_DIGITS;

    /** Enum of valid digits. **/
    public static enum DigitRep {
        ZERO    (   " _ \n" +
                    "| |\n" +
                    "|_|"       ),

        ONE (       "   \n" +
                    "  |\n" +
                    "  |"       ),

        TWO (       " _ \n" +
                    " _|\n" +
                    "|_ "       ),

        THREE   (   " _ \n" +
                    " _|\n" +
                    " _|"       ),

        FOUR    (   "   \n" +
                    "|_|\n" +
                    "  |"       ),

        FIVE    (   " _ \n" +
                    "|_ \n" +
                    " _|"       ),

        SIX     (   " _ \n" +
                    "|_ \n" +
                    "|_|"       ),

        SEVEN   (   " _ \n" +
                    "  |\n" +
                    "  |"       ),

        EIGHT   (   " _ \n" +
                    "|_|\n" +
                    "|_|"       ),

        NINE    (   " _ \n" +
                    "|_|\n" +
                    " _|"       );

        private String blockRep;

        DigitRep(String blockRep) {
            this.blockRep = blockRep;
        }

        @Override
        public String toString() {
            return blockRep;
        }
    }

    static {
        /* Initialize the map of acceptable character blocks. */
        Map tmpMap = new HashMap();
        tmpMap.put( DigitRep.ZERO.toString(),   "0");
        tmpMap.put( DigitRep.ONE.toString(),    "1");
        tmpMap.put( DigitRep.TWO.toString(),    "2");
        tmpMap.put( DigitRep.THREE.toString(),  "3");
        tmpMap.put( DigitRep.FOUR.toString(),   "4");
        tmpMap.put( DigitRep.FIVE.toString(),   "5");
        tmpMap.put( DigitRep.SIX.toString(),    "6");
        tmpMap.put( DigitRep.SEVEN.toString(),  "7");
        tmpMap.put( DigitRep.EIGHT.toString(),  "8");
        tmpMap.put( DigitRep.NINE.toString(),   "9");       
        VALID_DIGITS = Collections.unmodifiableMap(tmpMap);
    }

    /**
     * Private constructor to enforce flyweight/factory pattern.
     * 
     * @param blockRep
     */
    private Digit(String blockRep) {
        this.blockRep = blockRep;
    }

    /**
     * Flyweight factory method to create a Digit object from the "block"
     * representation of the digit.
     * @param blockRep The "block" representation of a digit.  Should look
     * something like:
     * " _ \n"
     * "|_|\n"
     * "|_|"
     * @return A flyweight Digit object representing the digit.
     */
    public static synchronized Digit getDigit(String blockRep) {
        Digit digit = digits.get(blockRep);
        if(digit == null) {
            digit = new Digit(blockRep);
            digits.put(blockRep, digit);
        }

        return digit;
    }

    /**
     * Determines whether or not the digit is valid.
     * @return true if the digit is valid, else false.
     */
    public boolean isValid() {
        return VALID_DIGITS.containsKey(blockRep);
    }

    /**
     * Accessor method to get the block representation of this digit.
     * 
     * @return
     */
    public String getBlockRep() {
        return blockRep;
    }

    @Override
    public String toString() {
        return VALID_DIGITS.containsKey(blockRep) ? VALID_DIGITS.get(blockRep) : "?";
    }
}

1
कम ज्ञात लेकिन फिर भी अविश्वसनीय रूप से उपयोगी पैटर्न में से एक।
मैटवेवी

2

चार पैटर्न के अधिकांश मूल गैंग आज भी उपयोग किए जाते हैं, लेकिन अन्य अब लोकप्रिय हैं जो किताब में नहीं हैं।

आपके द्वारा उपयोग की जाने वाली भाषा में Design Patters का संदर्भ खोजें। वे अधिक ठोस होते हैं और विशिष्ट रूप और सुरुचिपूर्ण तरीके से पैटर्न को लागू करने के लिए विशिष्ट भाषा सुविधाओं का उपयोग करते हैं।

डिजाइन पैटर्न के लिए तीन महान संसाधन:

"हेड फर्स्ट डिज़ाइन पैटर्न" बुक - पसंद की भाषा जावा है, लेकिन सभी भाषाओं के लिए प्रासंगिक है। dofactory डिजाइन पैटर्न - महान और मुफ्त .net डिजाइन पैटर्न कोड के साथ स्पष्टीकरण। PluralSight - डिज़ाइन पैटर्न लाइब्रेरी - यह भुगतान किया जाता है, लेकिन सूची में इसे शामिल नहीं करना बहुत अच्छा है।


1

वैसे यदि आप ACE जैसी आम लाइब्रेरी का उपयोग करते हैं, तो आप जितना सोचते हैं, उससे अधिक का उपयोग करके समाप्त कर देते हैं। मैं ऑब्जर्वर / ऑब्जर्वेबल का बड़े पैमाने पर उपयोग करता हूं :-)


1

मैंने कम से कम एक बार एक बिल्डर का उपयोग किया (एक ही कनवर्टर प्रक्रिया HTML या एक्सेल आउटपुट का निर्माण कर सकती थी)।

मैं अक्सर टेम्पलेट विधि (JDBC से संबंधित कार्यों के लिए, या अमूर्त स्विंग नियंत्रकों के लिए) का उपयोग करता हूं।

एक बार मुझे बहुत सारी नई सुविधाओं को एक फॉर्म-आधारित एप्लिकेशन में विकसित करना पड़ा, जो एक गड़बड़ थी। मैं केवल तब ही प्रगति कर सकता था जब मैंने मौजूदा सामान को एक स्टेट-पैटर्न आधारित समाधान में बदल दिया था। (खैर, यह सबसे)।

मैं अक्सर कमांड (स्विंग एक्ट्स) का भी इस्तेमाल करता हूं, और ऑब्जर्वर का भी।

एक बार मैंने स्विंग रूपों में परिवर्तन का पता लगाने के लिए मेमेमेंटो-जैसे समाधान का उपयोग किया। यह प्रपत्र अपने राज्य की क्रमबद्धता की तुलना करेगा जो मैंने पहले राज्यों की तुलना में (बराबर) किया था।


1

मेरा मानना ​​है कि मैंने अपने करियर में सबसे ज्यादा उन्हें आउट किया। केवल एक ही मुझे यकीन है कि मैंने इस्तेमाल नहीं किया है कि एडेप्टर पैटर्न किताब पर कई विरासत के साथ लागू किया जाता है क्योंकि मैं कई विरासत का बड़ा प्रशंसक नहीं हूं।


1

मैं डेकोरेटर का शौकीन हूं। केवल एक ही मुझे मिला है जो उल्लेख किया गया है वह प्रॉक्सी है।

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