2016-02-06 3 views
6

में फैक्टरी पैटर्न बनाम कन्स्ट्रक्टर पैटर्न मैंने जावास्क्रिप्ट में डिज़ाइन पैटर्न के बारे में एक ट्यूटोरियल देखा। हालांकि ट्यूटोरियल अच्छा था, लेकिन मुझे कुछ सवाल के साथ छोड़ दिया।जावास्क्रिप्ट

जैसा कि मैंने देखा कि फैक्टरी और निर्माता एक ही परिणाम उत्पन्न करते हैं। तो उनमें से दोनों के बीच क्या अंतर है? प्रत्येक के लिए उपयोग केस परिदृश्य क्या हैं?

फैक्टरी पैटर्न

function factoryPattern(data) { 
    var factory = {}; 
    factory.name = data.name; 
    factory.title = data.title; 
    factory.startDate = data.startDate; 
    return factory; 
} 
var factoryUse = factoryPattern(jsonObj); 

निर्माता पैटर्न

function constructorPattern(data) { 
    this.name = data.name; 
    this.title = data.title; 
    this.startDate = data.startDate; 
} 

var constructorUse = new constructorPattern(); 

संपादित: @Michael वार्नर ने समझाया। कारखाने की विधि अपरिवर्तनीय वस्तु लौटाती है जिसके निर्माण के बाद उनके निर्माता को कोई लिंक नहीं है।

लेकिन कन्स्ट्रक्टर पटर में वे उनके साथ लिंक करते हैं।

तो व्यावहारिक उपयोग करने के मामले में यह समझने के लिए बेहतर होगा कि कभी-कभी ऑब्जेक्ट रखने के लिए अच्छा क्यों होता है जो उनके कन्स्ट्रक्टर से लिंक होता है।

+2

कारखाने पैटर्न, कैश से पुराने वस्तुओं का उत्पादन कर सकते, तो उदाहरण के लिए यह इनपुट –

+0

@JosephYoung से अपरिवर्तनीय वस्तुओं का निर्माण कर रहा: मैं माफी चाहता हूँ, लेकिन मैं आपको नहीं मिला। क्या आप इसे एक लेमेन टर्म – Carlos

उत्तर

1

एक कारखाने के साथ, आपके पास वापस आने के लिए वस्तु पर पूरी आजादी है, इसलिए आप अपने इनपुट डेटा, या दिन के समय, या यहां तक ​​कि कुछ भी नहीं बनाते समय एक कन्स्ट्रक्टर या दूसरा चुन सकते हैं - सिगरेट वापस करने के लिए कारखाने।

इसके विपरीत एक निर्माता मूल रूप से एक विशिष्ट प्रोटोटाइप के साथ एक ऑब्जेक्ट को तुरंत चालू करता है, जिसे आप बाद में, कन्स्ट्रक्टर फ़ंक्शन के शरीर में कॉन्फ़िगर कर सकते हैं।

5

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

var Car = function(){ 
    var car = {}; 
    car.running = false; 
    car.toggleEngine = function(){ 
     this.running = !this.running; 
    } 
    return car; 
}; 

car1 = Car(); // running false 
car2 = Car(); // running false 
car1.toggleEngine(); // running true 
car2.toggleEngine = undefined; // to broke down. 
car1.toggleEngine(); //running false 

कन्स्ट्रक्टर फ़ंक्शन में कोड जोड़ते हैं ताकि आपके पास ऑब्जेक्ट कन्स्ट्रक्टर के प्रोटोटाइप का लिंक हो। इस अतिरिक्त लिंक के बारे में अच्छा हिस्सा कार्यात्मक साझा तकनीक का उपयोग करना है जो इस तरह दिखता है।

var Car = function(){ 
    this.running = false; 
}; 
Car.prototype.toggleEngine = function(){ 
    this.running = !this.running; 
} 
var car1 = new Car; //running false 
var car2 = new Car; //running false 

car2.toggleEngine() //running true 
Car.prototype.toggleEngine = function(){}; 
car1.toggleEngine() //running false 

जैसा कि हम वस्तुओं के निर्माण के बाद देख सकते हैं, वे अभी भी बहुत जुड़े हुए थे।

स्पष्ट होने के लिए आप अभी भी निम्न कार्य कर सकते हैं और निर्माता द्वारा बनाई गई वस्तुओं को प्रभावित नहीं कर सकते हैं। कार्यात्मक साझा विधि के साथ और निर्माता द्वारा दिए गए प्रोटोटाइप फ़ंक्शन को मुखौटा करें। इसलिए पूरी तरह से जुड़े नहीं हैं लेकिन वे रचनाकार प्रोटोटाइप के माध्यम से जुड़े हुए हैं।

var car1 = new Car; //running false 
var car2 = new Car; //running false 

car2.toggleEngine() //running true 
car2.toggleEngine = function(){}; 
car1.toggleEngine() //running true 
+2

ठीक के रूप में समझा सकते हैं, यह अच्छा स्पष्टीकरण था, तो क्या आप मुझे ऐसे मामले का उपयोग कर सकते हैं जहां कन्स्ट्रक्टर फ़ंक्शन का लिंक उपयोगी है – Carlos

+0

कन्स्ट्रक्टर फ़ंक्शंस का उपयोग स्मृति प्रबंधन के लिए सबसे अच्छा अभ्यास है क्योंकि सिस्टम केवल एक सेट घोषित करता है प्रोटोटाइप से जुड़े कार्यों का। यह आपको es2015 कक्षाएं बनाने के लिए भी सेट करता है। वे सिंटैक्टिक चीनी की एक ही चीज़ हैं। –

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