06月19, 2016

PHP设计模式——工厂模式

简单工厂模式的缺点

上次我们说了简单工厂模式,回顾下代码。 interface db { public function conn(); }

class MysqlEngine implements db {

    public function conn()
    {
        // TODO: Implement conn() method.
        echo "Mysql has benn connected";
    }
}

class SqlServerEngine implements db {

    public function conn()
    {
        // TODO: Implement conn() method.
        echo "Sqlserver has benn connected";
    }

}



class DbFactory {

    public function getDb($name)
    {
        if ($name == "mysql") return new MysqlEngine();
        else if ($name == "sqlserver") return new SqlServerEngine();
    }

}

$scheduler = new DbFactory();
$db = $scheduler->getDb("mysql");
$db->conn();

这样实现固然已经实现了封装性,但我们却违反了面向对象的另一设计原则,开闭原则(对扩展开放,对修改关闭)。如果我们要新添一个oracle类,则需要增加一个else if,这样会牵扯到之前mysql和sqlserver的代码。这时引入工厂类可以解决我们的问题。

interface db {
    public function conn();
}

interface DBfactory {
    public function getDB();
}

class MysqlEngine implements db {

    public function conn()
    {
        // TODO: Implement conn() method.
        echo "Mysql has benn connected";
    }
}

class SqlServerEngine implements db {

    public function conn()
    {
        // TODO: Implement conn() method.
        echo "Sqlserver has benn connected";
    }

}


class MysqlFactory implements DBfactory{
    public function getDB()
    {
        // TODO: Implement getDB() method.
        return new MysqlEngine();
    }
}

class SqlServerFactory implements DBfactory {
    public function getDB()
    {
        // TODO: Implement getDB() method.
        return new SqlServerEngine();
    }
}

$scheduler = new SqlServerFactory();
$db = $scheduler->getDb();
$db->conn();

$scheduler = new MysqlFactory();
$db = $scheduler->getDb();
$db->conn();

如果需要增加sqlite,oracle只需要增加一个工厂,一个实现即可,之前的代码不会变动。

本文链接:http://www.qiana.info/post/factory.html

-- EOF --

Comments