美文网首页
2、php工厂模式

2、php工厂模式

作者: 水电梁师傅 | 来源:发表于2018-07-14 10:26 被阅读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(); 
    
    

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

    相关文章

      网友评论

          本文标题:2、php工厂模式

          本文链接:https://www.haomeiwen.com/subject/akyuuftx.html