2、php工厂模式

2018-07-14  本文已影响13人  水电梁师傅

书接上文,简单工厂模式。发现简单工厂模式有着致命的问题,不符合开闭原则;

所谓开闭原则,对于扩展是开放的,对于修改是关闭的,这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。

因为设计模式是从编译语言那里过来的,所以编译语言在编译后不方便修改,所以这个时候整个项目编译可能需要好几个钟,这样就不合适,所以需要考虑开闭原则以缩短项目工期。

那代码里面究竟出现了什么,为什么说不符合开闭原则,因为ifelse那里,假设如果有很多的数据库,那么意味着ifelse会增加更多的判断,假设未来还有更多的数据库新增,这种修改是不符合所想的,我们需要一种新的结构,对工厂类本身不进行修改,或者说不希望对原来的代码进行修改。

于是,我新建一个工厂接口。创建数据库类实现工厂接口

interface Db
{
         public function conn();
}

interface Factory
{
    public function createdb();
}
class MysqlDb  implements Db
{
    public function conn()
    {
        echo 'mysql已连接';
        echo '<br>';
    }
}
class MysqlFactory implements  Factory
{
    public function createdb()
    {
        return new MysqlDb();
    }
}

$mysqlfctory = new MysqlFactory();
$mysqldb = $mysqlfctory->createdb();
$mysqldb->conn()

这样,以后无论是怎么新建数据库连接都不用修改代码了,只需要继承工厂接口和数据库接口即可,比方说,新建一个oracle的数据库这时候只需要这样写

interface Db
{
         public function conn();
}

interface Factory
{
    public function createdb();
}
class MysqlDb  implements Db
{
    public function conn()
    {
        echo 'mysql已连接';
        echo '<br>';
    }
}
class MysqlFactory implements  Factory
{
    public function createdb()
    {
        return new MysqlDb();
    }
}
class OracleDb implements  Db
{
    public function conn()
    {
        echo 'oracle已连接';
    }
}
class OracleFactory implements  Factory
{
    public function createdb()
    {
        return new OracleDb();
    }
}
$mysqlfctory = new MysqlFactory();
$mysqldb = $mysqlfctory->createdb();
$mysqldb->conn();

$oraclefactory = new OracleFactory();
$oracledb =  $oraclefactory->createdb();
$oracledb->conn(); 

只需要新增类,而不需要修改原来的代码,工厂方法,完成

上一篇下一篇

猜你喜欢

热点阅读