खोज…


टिप्पणियों

Multitonitis

सिंगलटन के रूप में भी, मल्टीटन को एक बुरा अभ्यास माना जा सकता है। हालांकि, ऐसे समय होते हैं जब आप इसे बुद्धिमानी से उपयोग कर सकते हैं (उदाहरण के लिए, यदि आप कई वस्तुओं को जारी रखने के लिए ORM / ODM जैसी प्रणाली का निर्माण कर रहे हैं)।

सिंगलेट्स का पूल (PHP उदाहरण)

मल्टीटोन का उपयोग एकल के लिए कंटेनर के रूप में किया जा सकता है। यह मल्टीटन कार्यान्वयन सिंगलटन और पूल पैटर्न का एक संयोजन है।

यह इस बात का एक उदाहरण है कि आम मल्टीटॉन सार पूल वर्ग कैसे बनाया जा सकता है:

abstract class MultitonPoolAbstract
{
    /**
     * @var array
     */
    protected static $instances = [];

    final protected function __construct() {}

    /**
     * Get class name of lately binded class
     *
     * @return string
     */
    final protected static function getClassName()
    {
        return get_called_class();
    }

    /**
     * Instantiates a calling class object
     *
     * @return static
     */
    public static function getInstance()
    {
        $className = static::getClassName();

        if( !isset(self::$instances[$className]) ) {
            self::$instances[$className] = new $className;
        }

        return self::$instances[$className];
    }

    /**
     * Deletes a calling class object
     *
     * @return void
     */
    public static function deleteInstance()
    {
        $className = static::getClassName();

        if( isset(self::$instances[$className]) )
            unset(self::$instances[$className]);
    }

    /*-------------------------------------------------------------------------
    | Seal methods that can instantiate the class
    |------------------------------------------------------------------------*/

    final protected function __clone() {}

    final protected function __sleep() {}

    final protected function __wakeup() {}
}

इस तरह हम विभिन्न सिंग्लटन पूलों को इंस्टेंट कर सकते हैं।

सिंगलेट्स की रजिस्ट्री (PHP उदाहरण)

इस पैटर्न का उपयोग एकल के पंजीकृत तालिकाओं को करने के लिए किया जा सकता है, प्रत्येक विशिष्ट आईडी द्वारा प्रतिष्ठित:

abstract class MultitonRegistryAbstract
{
    /**
     * @var array
     */
    protected static $instances = [];

    /** 
     * @param string $id
     */
    final protected function __construct($id) {}

    /**
     * Get class name of lately binded class
     *
     * @return string
     */
    final protected static function getClassName()
    {
        return get_called_class();
    }

    /**
     * Instantiates a calling class object
     *
     * @return static
     */
    public static function getInstance($id)
    {
        $className = static::getClassName();

        if( !isset(self::$instances[$className]) ) {
            self::$instances[$className] = [$id => new $className($id)];
        } else {
            if( !isset(self::$instances[$className][$id]) ) {
                self::$instances[$className][$id] = new $className($id);
            }
        }

        return self::$instances[$className][$id];
    }

    /**
     * Deletes a calling class object
     *
     * @return void
     */
    public static function unsetInstance($id)
    {
        $className = static::getClassName();

        if( isset(self::$instances[$className]) ) {
            if( isset(self::$instances[$className][$id]) ) {
                unset(self::$instances[$className][$id]);
            }

            if( empty(self::$instances[$className]) ) {
                unset(self::$instances[$className]);
            }
        }
    }

    /*-------------------------------------------------------------------------
    | Seal methods that can instantiate the class
    |------------------------------------------------------------------------*/

    final protected function __clone() {}

    final protected function __sleep() {}

    final protected function __wakeup() {}
}

यह पैटर्न का सरलीकृत रूप है जिसका उपयोग ओआरएम के लिए किसी दिए गए प्रकार की कई संस्थाओं को संग्रहीत करने के लिए किया जा सकता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow