سؤال

ما هي أفضل طريقة لاستخدام المفرد نمط تصميم جنبا إلى جنب مع نمط أسلوب مصنع في PHP5؟ بلدي السيناريو استخدام أبسط لذلك هو مثيل انتقائية اتصال قاعدة البيانات مرة واحدة فقط لكل نوع قاعدة البيانات.

هل كانت مفيدة؟

المحلول

ومصنع المفرد للاتصال DB:

class Registry
{
    private static $_objects;

    public static function set($key, $object)
    {
        if (!array_key_exists($key, self::$_objects)) self::$_objects[$key] = $object;
    }

    public static function get($key)
    {
        if (array_key_exists($key, self::$_objects)) return self::$_objects[$key];
        else return false;
    }
}

class DBFactory
{
    public static function getConnection($type)
    {
        switch ($type) {
            case 'pdo':
                if (!(Registry::get('DB_PDO') instaceof DbPdo)) Registry::set('DB_PDO', new DbPdo('user', 'pass', ...));
                return Registry::get('DB_PDO')
            case 'mssql':
                //same for other connections
            //...
        }
    }
}

والاستعمال:

$factory = DBFactory::getConnection('pdo');
ليست هناك حاجة

وسنغلتونس حقا بعد الآن لأن جميع طرق يمكن أن يسمى ثابت ... ولكن فئات قاعدة البيانات لا يزال من الممكن اعتبار سنغلتونس لأنه لن يكون هناك سوى حالة واحدة منها في التطبيق الخاص بك.

وهكذا يتم إنشاء نفس التأثير باستخدام أنماط المصنع والتسجيل.

ويمكن الاستعاضة عن التسجيل من خلال جعل الطبقات قاعدة البيانات الخاصة بك سنغلتونس ثم مصنع سيبدو هذا:

class DBFactory
{
    public static function getConnection($type)
    {
        switch ($type) {
            case 'pdo':
                return DbPdo::getInstance('user', 'pass', ...);
            case 'mssql':
                //same for other connections
            //...
        }
    }
}

class DbPdo
{
    private static $_instance;

    private function __construct($user, $pass, ...){ //instantiate object }

    public static function getInstance($user = null, $pass = null, ...)
    {
        if (!(self::$_instance instanceof DbPdo)) self::$_instance = new DbPdo($user, $pass, ...);
        return self::$_instance;
    }
}

وهكذا يكون لديك خيار لجعل كل ما تبذلونه من DB كائنات سنغلتونس أو باستخدام التسجيل. وأنا شخصيا سوف تذهب مع التسجيل لأنه يمكن استخدامها لتخزين أي نوع من أنواع الكائن، حتى تلك التي لا تريد أن تجعل الطبقة المفردة.

تتعرض

وخيارات التصميم دائما نكهة الشخصية المنظمة البحرية الدولية ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top