मैं PHP में फैक्ट्री पैटर्न को लागू करने के दो अलग-अलग तरीकों में से एक पर विचार कर रहा हूं। मुझे नहीं पता कि इन प्रकारों के उचित नाम हैं इसलिए अब मैं उन्हें आंतरिक कारखाना और बाहरी कारखाना कहूंगा।आंतरिक बनाम बाहरी कारखाना
आंतरिक कारखाना: कारखाने विधि एक स्थिर सार्वजनिक विधि के रूप में वर्ग अपने आप में कार्यान्वित किया जाता है
<?php
class Foo
{
protected
$loadedProps = false;
public static factory ($id)
{
$class = get_called_class();
$item = new $class ($id);
if ($item -> loadedProps())
{
return ($item);
}
}
public function loadedProps()
{
return ($this -> loadedProps);
}
protected function loadPropsFromDB ($id)
{
// Some SQL logic goes here
}
protected function __construct ($id)
{
$this -> loadedProps = $this -> loadPropsFromDB ($id);
}
}
?>
बाहरी कारखाना: कारखाने और आइटम यह initializes अलग संस्थाओं के रूप में लागू किया जाता है
<?php
class Foo
{
protected
$loadedProps = false;
public function loadedProps()
{
return ($this -> loadedProps);
}
protected function loadPropsFromDB ($id)
{
// Some SQL logic goes here
}
public function __construct ($id)
{
$this -> loadedProps = $this -> loadPropsFromDB ($id);
}
}
abstract class FooFactory
{
public static factory ($id)
{
$item = new Foo ($id);
if ($item -> loadedProps())
{
return ($item);
}
}
}
?>
अब मुझे लगता है कि प्रत्येक के पास इसकी योग्यता है।
पूर्व आपको बाहरी दुनिया से निर्माता को छिपाने की अनुमति देता है। इसका मतलब है कि आप फू ऑब्जेक्ट बनाने का एकमात्र तरीका फैक्ट्री के माध्यम से कर सकते हैं। यदि आइटम की स्थिति डीबी से लोड नहीं की जा सकती है तो फैक्ट्री न्यूल लौटाएगी जिसे आप आसानी से कोड में देख सकते हैं।
if ($item = Foo::factory ($id))
{
// ...
}
else
{
// The item failed to load. Handle error here
}
कारखाना किसी भी संशोधन के बिना फू के किसी भी उप-वर्ग की वस्तुएं भी बना सकता है।
हालांकि, ऐसा लगता है कि इसमें कुछ कमीएं हैं। सबसे पहले कक्षा को फैक्ट्री को लागू करना होता है, जो कक्षा में जिम्मेदारियां डाल सकता है जो वास्तव में कहीं और संबंधित है। आंतरिक फैक्ट्री संस्करण निश्चित रूप से बाहरी फैक्टरी संस्करण की तुलना में एक बड़ी कक्षा में परिणाम देता है।
बाहरी कारखाने के लिए, अच्छी तरह से यह साफ है क्योंकि फैक्ट्री कक्षा में नहीं है और मुझे किसी वर्ग के बारे में चिंता करने की आवश्यकता नहीं है जितनी चाहिए। बाह्य कारखाना निर्भरता इंजेक्शन के लिए बेहतर अनुकूल भी हो सकता है।
हालांकि, इसका अपना खुद का दोष है। सबसे पहले और सबसे महत्वपूर्ण, कारखाने में बनाए जाने वाले आइटम का निर्माता सार्वजनिक होना चाहिए क्योंकि PHP में पैकेज की अवधारणा नहीं है और वर्ग के सदस्यों के लिए 'पैकेज' सुरक्षा स्तर नहीं है। इसका मतलब है कि केवल नए फू() और फैक्ट्री को छोड़कर कोडर को रोकना कुछ नहीं है (हालांकि यह इकाई परीक्षण को आसान बना सकता है)।
दूसरी समस्या यह है कि FooFactory केवल फू ऑब्जेक्ट्स बना सकता है, न कि इसके किसी भी उप-वर्ग। यह कक्षा नाम निर्दिष्ट करने के लिए FooFactory में एक और पैरामीटर जोड़कर मिल सकता है, लेकिन फिर फैक्ट्री को आंतरिक जांच करना होगा कि निर्दिष्ट ऑब्जेक्ट क्लास वास्तव में फू के वंशज है।
तो मूल रूप से, दोनों दृष्टिकोणों की सापेक्ष योग्यता क्या है, और आप किसकी सिफारिश करेंगे?
इसके अलावा, अगर उनके पास आंतरिक या बाहरी कारखाने की तुलना में अधिक उचित नाम हैं, तो मैं उन्हें जानना चाहता हूं।
'ऑफ-विषय: 'एक यादृच्छिक नोट पर मुझे यह विनोदी लगता है कि आप दोनों एक ही चीज़ के बारे में बात कर रहे हैं जब आपके पास एक ही उपयोगकर्ता नाम है। एक सेकंड के लिए मैंने सोचा कि आप खुद से बात कर रहे थे। – Tek
@ टेक हाँ, गॉर्डन ने गॉर्डन का जवाब दिया। लेकिन मैं गॉर्डन ™ हूँ :) – Gordon