फ़ैक्टरी (या फ़ैक्टरी विधि) डिज़ाइन पैटर्न प्रतिनिधिमंडल और इनकैप्सुलेशन में माहिर है। यह पैटर्न एक सुपरक्लास को उपवर्गों के लिए तात्कालिकता को स्थगित करने की अनुमति देता है। ऐसा इसलिए है क्योंकि जिस वर्ग में प्राथमिक फ़ैक्टरी विधि पैटर्न होता है वह सार है।
फ़ैक्टरी पद्धति का मूल संस्करण एक गैर-कार्यान्वित विधि का रूप धारण कर लेता है क्योंकि यह उस उत्पाद को नहीं जानता है जो इसे बनाएगा। फ़ैक्टरी पद्धति को पता चल सकता है कि यह कुछ उत्पाद बना रहा है, लेकिन यह उस उत्पाद की विशिष्ट विशेषताओं को नहीं जानता जो इसे बनाएगा। यह ज्ञान केवल संबंधित उपवर्गों के लिए उपलब्ध है। इसलिए, फ़ैक्टरी पद्धति को लागू करने और उपयुक्त वस्तुएँ बनाने की ज़िम्मेदारी पूरी तरह से एक उपवर्ग की है।
जावा में फ़ैक्टरी डिज़ाइन पैटर्न लागू करना
यह आलेख एक नमूना फ़ीडबैक रिपोर्ट जनरेशन एप्लिकेशन का उपयोग करता है। यह एप्लिकेशन विशिष्ट रिपोर्ट (फ़ैक्टरी विधि का उपयोग करके) बनाने के लिए कंपनी द्वारा प्राप्त विभिन्न प्रकार के फीडबैक (एक नए स्नैक के लिए) का उपयोग करता है। इसलिए, फ़ैक्टरी पैटर्न निम्नलिखित प्राथमिक उत्पाद वर्ग को आधार के रूप में उपयोग करके विशिष्ट प्रतिक्रिया (या प्रतिक्रिया रिपोर्ट) बनाएगा:
जनताअमूर्तकक्षाप्रतिक्रिया{
निजी डोरी समीक्षक का नाम;
निजी डोरी समीक्षा संदेश;
निजीint यहाँ समीक्षा रेटिंग;
जनताप्रतिक्रिया(स्ट्रिंग समीक्षक नाम, स्ट्रिंग समीक्षा संदेश, int यहाँ समीक्षा रेटिंग){
यह.reviewerName = समीक्षकनाम;
यह.समीक्षा संदेश = समीक्षा संदेश;
यह.reviewRatings = ReviewRatings;
}
जनता डोरी getReviewerName(){
वापस करना समीक्षक का नाम;
}
जनताखालीपनsetReviewerName(स्ट्रिंग समीक्षक नाम){
यह.reviewerName = समीक्षकनाम;
}
जनता डोरी getReviewMessage(){
वापस करना समीक्षा संदेश;
}
जनताखालीपनसेट समीक्षा संदेश(स्ट्रिंग समीक्षा संदेश){
यह.समीक्षा संदेश = समीक्षा संदेश;
}
जनताint यहाँgetReviewRatings(){
वापस करना समीक्षा रेटिंग;
}
जनताखालीपनsetReviewRatings(int यहाँ समीक्षा रेटिंग){
यह.reviewRatings = ReviewRatings;
}
}
नए स्नैक के लिए प्रत्येक फीडबैक में तीन अनिवार्य गुण, एक समीक्षक का नाम, एक समीक्षा संदेश और एक संख्या रेटिंग (एक से पांच तक) होगी। कंपनी को मिलने वाले विभिन्न प्रकार के फीडबैक तीन चैनलों में से एक से आएंगे:
ईमेल प्रतिक्रिया वर्ग
जनताकक्षाईमेल प्रतिक्रियाका विस्तारप्रतिक्रिया{
निजी डोरी समीक्षक ईमेल;
सार्वजनिक ईमेल प्रतिक्रिया (डोरी समीक्षक का नाम, डोरी समीक्षा संदेश, अंतर समीक्षा रेटिंग, डोरी समीक्षक ईमेल) {
बहुत अच्छा(समीक्षक का नाम, समीक्षा संदेश, समीक्षा रेटिंग);
यह.reviewerEmail = समीक्षक ईमेल;
}
जनता डोरी getReviewerEmail(){
वापस करना समीक्षक ईमेल;
}
जनताखालीपनsetReviewerEmail(स्ट्रिंग समीक्षक ईमेल){
यह.reviewerEmail = समीक्षक ईमेल;
}
}
मेल प्रतिक्रिया वर्ग
जनताकक्षामेलफीडबैकका विस्तारप्रतिक्रिया{
निजी डोरी भेजने वाले का पता;
सार्वजनिक मेल प्रतिक्रिया (डोरी समीक्षक का नाम, डोरी समीक्षा संदेश, अंतर समीक्षा रेटिंग, डोरी भेजने वाले का पता) {
बहुत अच्छा(समीक्षक का नाम, समीक्षा संदेश, समीक्षा रेटिंग);
यहरिटर्नएड्रेस = रिटर्नएड्रेस;
}जनता डोरी getReturnAddress(){
वापस करना भेजने वाले का पता;
}
जनताखालीपनsetReturnAddress(स्ट्रिंग वापसी पता){
यहरिटर्नएड्रेस = रिटर्नएड्रेस;
}
}
सोशल मीडिया फीडबैक क्लास
जनताकक्षासोशल मीडिया फीडबैकका विस्तारप्रतिक्रिया{
निजी डोरी समीक्षक हैंडल;
सार्वजनिक सोशल मीडिया फीडबैक (डोरी समीक्षक का नाम, डोरी समीक्षा संदेश, अंतर समीक्षा रेटिंग, डोरी समीक्षक हैंडल) {
बहुत अच्छा(समीक्षक का नाम, समीक्षा संदेश, समीक्षा रेटिंग);
यह.reviewerHandle = समीक्षक हैंडल;
}
जनता डोरी getReviewerHandle(){
वापस करना समीक्षक हैंडल;
}
जनताखालीपनsetReviewerHandle(स्ट्रिंग समीक्षक हैंडल){
यह.reviewerHandle = समीक्षक हैंडल;
}
}
आप देखेंगे कि प्रत्येक फ़ीडबैक उपवर्ग के पास एक विशिष्ट गुण होता है। इसका मतलब यह है कि आपको प्रत्येक फ़ीडबैक प्रकार के लिए कम से कम एक ऐसी प्रॉपर्टी का उपयोग करके रिपोर्ट बनानी होगी जो उस प्रकार के लिए अद्वितीय हो।
सरल कारखाना
फ़ैक्टरी डिज़ाइन पैटर्न का उपयोग करने के लिए एक साधारण फ़ैक्टरी एक लोकप्रिय तरीका है। यह दृष्टिकोण एक विधि (सरल फैक्ट्री) में सभी अलग-अलग फीडबैक (या उत्पादों) को समूहबद्ध करने और पैरामीटर के आधार पर उचित प्रतिक्रिया का चयन करने पर जोर देता है।
जनताकक्षाफीडबैक रिपोर्ट फैक्टरी{
जनता प्रतिक्रिया makefeedback(स्ट्रिंग प्रतिक्रिया प्रकार){
फीडबैक फीडबैक = व्यर्थ;
अगर(प्रतिक्रिया प्रकार। बराबर ("ईमेल")) {
प्रतिक्रिया = नया ईमेल प्रतिक्रिया ();
}अन्यअगर (प्रतिक्रिया प्रकार। बराबर ("मेल")) {
प्रतिक्रिया = नया मेलफीडबैक ();
}अन्यअगर (प्रतिक्रिया प्रकार। बराबर ("सामाजिक")) {
प्रतिक्रिया = नया सोशल मीडिया फीडबैक ();
}
वापस करना प्रतिक्रिया;
}
}
हालाँकि, साधारण फ़ैक्टरी दृष्टिकोण फ़ैक्टरी डिज़ाइन पैटर्न नहीं है, न ही यह डिज़ाइन पैटर्न है। यह एक डिजाइन अवधारणा की तरह अधिक है।
फैक्टरी विधि
फ़ैक्टरी विधि डिज़ाइन पैटर्न का सही प्रतिनिधित्व है। कारखाने की विधि का उपयोग करते हुए, सुधार किया गया फीडबैक रिपोर्ट फैक्टरीजावा वर्ग अब निम्नलिखित कोड शामिल होंगे:
जनताअमूर्तकक्षाफीडबैक रिपोर्ट फैक्टरी{
जनताअमूर्तखालीपनMakeFeedbackReport(जानकारी देना);
}
आप निम्न वर्ग आरेख के साथ फ़ैक्टरी डिज़ाइन पैटर्न की संरचना को परिभाषित कर सकते हैं:
ऊपर दिए गए आरेख से आप देखेंगे कि एक अमूर्त वर्ग (या इंटरफ़ेस) में फ़ैक्टरी पद्धति का एक सार संस्करण होगा। इसलिए, अमूर्त वर्ग का विस्तार करने वाली ठोस फ़ैक्टरी कक्षाएं उन गुणों का उपयोग करके फ़ैक्टरी पद्धति को लागू करेंगी जो उस उत्पाद के लिए अद्वितीय हैं जिसे वह बनाना चाहता है। आपको यह भी ध्यान देना चाहिए कि किसी भी ठोस कारखाने वर्ग को एक या अधिक उत्पाद बनाने चाहिए।
नमूना आवेदन में तीन संबंधित लेकिन अद्वितीय उत्पाद हैं। प्रत्येक प्रतिक्रिया प्रकार में कम से कम एक अनूठी संपत्ति होती है। इसलिए, एप्लिकेशन को प्रत्येक उत्पाद के निर्माण के लिए तीन ठोस कारखानों की आवश्यकता होगी।
ईमेल प्रतिक्रिया फैक्टरी
जनताकक्षाईमेल फीडबैक रिपोर्टका विस्तारफीडबैक रिपोर्ट फैक्टरी{
ईमेल प्रतिक्रिया प्रतिक्रिया;
@Override
जनताखालीपनMakeFeedbackReport(जानकारी देना){
यह.फ़ीडबैक = (ईमेल फ़ीडबैक) फ़ीडबैक;
प्रणाली।बाहर.println("\एन रिपोर्टके लिएप्रतिक्रियाके जरिएईमेल" +
"\nसमीक्षक का नाम:" +यह.feedback.getReviewerName () +
"\nप्रतिक्रिया:" + यह.feedback.getReviewMessage() +
"\nमूल्यांकन:" + यह.feedback.getReviewRatings() +
"\nईमेल पता:" + यह.feedback.getReviewerEmail ());
}
}
मेल फीडबैक फैक्टरी
जनताकक्षामेलफीडबैक रिपोर्टका विस्तारफीडबैक रिपोर्ट फैक्टरी{
मेलफीडबैक प्रतिक्रिया;
@Override
जनताखालीपनMakeFeedbackReport(जानकारी देना){
यह.फीडबैक = (मेलफीडबैक) फीडबैक;
प्रणाली।बाहर.println("\एन रिपोर्टके लिएप्रतिक्रियाके जरिएमेल" +
"\nसमीक्षक का नाम:" +यह.feedback.getReviewerName () +
"\nप्रतिक्रिया:" + यह.feedback.getReviewMessage() +
"\nमूल्यांकन:" + यह.feedback.getReviewRatings() +
"\nडाक पता:" + यह.feedback.getReturnAddress ());
}
}
सोशल मीडिया फीडबैक फैक्ट्री
जनताकक्षासोशल मीडिया फीडबैक रिपोर्टका विस्तारफीडबैक रिपोर्ट फैक्टरी{
सोशल मीडिया फीडबैक फीडबैक;
@Override
जनताखालीपनMakeFeedbackReport(जानकारी देना){
यह.फीडबैक = (सोशलमीडियाफीडबैक) फीडबैक;
प्रणाली।बाहर.println("\एन रिपोर्टके लिएप्रतिक्रियाके जरिएसामाजिकमिडिया" +
"\nसमीक्षक का नाम:" + यह.feedback.getReviewerName () +
"\nप्रतिक्रिया:" + यह.feedback.getReviewMessage() +
"\nमूल्यांकन:" + यह.feedback.getReviewRatings() +
"\nसमीक्षक सोशल मीडिया हैंडल: " + यह.feedback.getReviewerHandle ());
}
}
नमूना आवेदन का परीक्षण
अब आप विभिन्न चैनलों से प्राप्त फीडबैक पर लघु रिपोर्ट बनाने के लिए संबंधित फ़ैक्टरी विधियों का उपयोग कर सकते हैं। तुम कर सकते हो JUnit का उपयोग करके एप्लिकेशन का परीक्षण करें, या आप ड्राइवर वर्ग बना सकते हैं:
जनताकक्षामुख्य{
जनतास्थिरखालीपनमुख्य(स्ट्रिंग [] तर्क){
फीडबैक फीडबैक = नया ईमेल प्रतिक्रिया ("निक", "महान उत्पाद!", 5, "निक@email.com");
फीडबैक फीडबैक2 = नया मेलफीडबैक("जॉन", "उत्पाद अच्छा है लेकिन ऐसा कुछ नहीं है जिसे मैं नियमित रूप से खरीदूंगा", 4, "पहली सड़क");
फीडबैक फीडबैक 3 = नया सोशलमीडियाफीडबैक("जेन", "यह मेरे लिए नहीं है", 2, "@ जेनी");
फीडबैक रिपोर्ट फैक्ट्री फैक्ट्री = नया ईमेल फीडबैक रिपोर्ट ();
फीडबैक रिपोर्ट फैक्ट्री फैक्ट्री 2 = नया मेलफीडबैक रिपोर्ट ();
प्रतिक्रियाReportFactory factory3 = नया सोशल मीडिया फीडबैक रिपोर्ट ();
कारखाना.मेकफीडबैकरिपोर्ट(प्रतिक्रिया);
कारखाना2.मेकफीडबैकरिपोर्ट(प्रतिक्रिया2);
कारखाना3.मेकफीडबैकरिपोर्ट(प्रतिक्रिया3);
}
उपरोक्त मुख्य वर्ग तीन रिपोर्ट बनाने के लिए संबंधित कारखानों का उपयोग करता है, कंसोल में निम्नलिखित आउटपुट का उत्पादन करता है:
फ़ैक्टरी डिज़ाइन पैटर्न का उपयोग करने के लाभ
फ़ैक्टरी डिज़ाइन पैटर्न डिज़ाइन के लचीलेपन को बढ़ावा देता है, जहाँ आप ठोस वर्ग बनाने के लिए इंटरफेस (या सार वर्ग) का उपयोग करते हैं। यह बहुरूपता के माध्यम से स्केलेबिलिटी को भी बढ़ावा देता है, नए वर्गों को मौजूदा इंटरफ़ेस को लागू करने की अनुमति देता है क्योंकि एप्लिकेशन का विस्तार होता है।
जब आप फ़ैक्टरी डिज़ाइन पैटर्न का उपयोग करते हैं, तो आप दो महत्वपूर्ण डिज़ाइन सिद्धांतों का उपयोग कर रहे हैं: ओपन-क्लोज़्ड और इनवर्जन ऑफ़ कंट्रोल (IoC)।