से बचने की कोशिश कर रहा हूं, मैं अपने सिस्टम के लिए कारखाने के वर्गों का एक सेट तैयार करने की कोशिश कर रहा हूं, जहां कारखाने द्वारा बनाई गई कुछ वस्तुओं को भी ठीक से उपयोग करने से पहले प्रारंभ करने की आवश्यकता है।ऑब्जेक्ट प्रारंभिकता के साथ फैक्ट्री क्लास - स्थिर
उदाहरण:
$foobar = new Foobar();
$foobar->init($qux, ...);
// $foobar ready for usage
उदाहरण के एक ही के लिए, मान का कहना है कि $qux
वस्तु केवल निर्भरता कि Foobar
की जरूरत है। क्या मैं करने के लिए प्राप्त करना चाहते हैं है:
$foobar = Foo_Factory('bar');
क्रम पूरी प्रणाली भर में $qux
वस्तु साथ भेज देते हैं और यह एक और पैरामीटर के रूप में कारखाने वर्ग के लिए पारित करने के लिए की जरूरत से बचने के लिए, मैं प्रदर्शन करने के लिए करना चाहते हैं कारखाने कक्षा में सीधे Foobar
का प्रारंभ:
class Foo_Factory {
public static function getFoo($type) {
// some processing here
$foo_name = 'Foo' . $type;
$foo = new $foo_name();
$foo->init($qux);
return $foo;
}
}
कुछ समाधान है कि दिमाग में आ रहे हैं, लेकिन उनमें से कोई आदर्श है:
- एक स्थिर सेटर मेथ जोड़े कारखाने वर्ग में
$qux
के लिए od, और इसे एक निजी स्थैतिक चर में$qux
का संदर्भ संग्रहीत करने दें। सिस्टम शुरुआत में$qux
सेट कर सकता है, और फैक्ट्री क्लास भविष्य में हुए बदलावों (सुरक्षा कारणों से) को रोक सकती है।
हालांकि यह दृष्टिकोण काम करता है,$qux
के संदर्भ में एक स्थिर पैरामीटर का उपयोग करके यूनिट परीक्षण के दौरान समस्याग्रस्त है (उदाहरण के लिए यह अपने स्थिर राज्य के कारण व्यक्तिगत परीक्षणों के बीच खुशी से रहता है)। - सिंगलटन पैटर्न का उपयोग करके एक नया संदर्भ वर्ग बनाएं और कारखाने वर्ग को
$qux
का संदर्भ प्राप्त करने के लिए इसका उपयोग करें। विकल्प # 1 से ऐसा करने के लिए यह थोड़ा क्लीनर तरीका हो सकता है (हालांकि हम कारखाने वर्ग से संदर्भ वर्ग में स्थिर समस्या को स्थानांतरित करते हैं)। - निर्भरता इंजेक्शन का उपयोग सभी तरह से करें, यानी
$qux
किसी भी ऑब्जेक्ट को फैक्ट्री क्लास का उपयोग करने के लिए पास करें, और उस ऑब्जेक्ट को फ़ैक्टरी क्लास के साथ अन्य पैरामीटर के रूप में पास करने दें:Foo_Factory::getFoo($type, $qux);
। - उपर्युक्त (# 3) के समान, लेकिन सिस्टम के साथ
$qux
पास करने के बजाय, कारखाने वर्ग के उदाहरण को पास करें (यानी इस मामले में यह स्थैतिक नहीं होगा, लेकिन तत्काल)।
आप क्या सलाह देंगे? ऊपर वर्णित चार विकल्पों में से कोई भी, या कृपया ऐसा करने का एक बेहतर तरीका है?
नोट: मैं यहां सबसे अच्छे समाधान के साथ आने की कोशिश कर रहा हूं, यहां static is evil
ज्वालामुखी में प्रवेश नहीं करना चाहता हूं।
आह, कि वास्तव में बहुत अच्छा है - मुझे लगता है कि मैं और अधिक विस्तार (व्यावहारिक रूप से) जब मैं एक मौका मिलता है में सिम्फनी पर गौर करना होगा। मैंने एक साधारण कंटेनर समाधान बनाया है, और जब भी मैं आंतरिक रूप से कारखानों का उपयोग कर रहा हूं, यह एक आकर्षण की तरह काम करता है :-) प्रतिक्रिया और उदाहरण के लिए धन्यवाद! – MicE