php设计模式-接口工厂模式

<?php
//------------------------------简单接口
// 共同接口
interface db 
{
    function conn();
}

// 服务端开发不知道将会被谁调用
class mysql implements  db
{
    public function conn()
    {
        echo  '连接mysql';
    }
}

class sqlit implements db
{
    public function conn()
    {
        echo '连接sqlit';
    }
}

// 客户端看不到mysql,sqlit内部细节,根据文档只清楚有两个接口
$db = new mysql;
$db->conn();  //连接mysql

$db = new sqlit;
$db->conn(); //连接sqlit

// --------------------------简单工厂
class Factory
{
    public static function createDb($type)
    {
        return new $type;
    }
}

// 客户端调用现在不知道有哪些类名,只知道接口支持mysql,sqlit,
// 提供了Factory::createDb方法,只要传数据库名称,就可以得到实例
$db = Factory::createDb('mysql');
$db->conn(); // 连接mysql

/**
 * 新增oracle数据库?
 * 在c++和java中修改代码要增加编译的成本,不符合增开增开修闭原则
 */

 //----------------------------- 接口工厂

 interface dbFactory 
 {
     public function createDb();
 }

 class mysqlFactory implements dbFactory
 {
     public function createDb()
     {
         return new mysql();
     }
 }

 class sqlitFactory implements dbFactory
 {
    public function createDb()
    {
        return new sqlit();
    }
 }

 // 客户端开始调用包
 $mysqlFactory = new mysqlFactory();
 $mysql = $mysqlFactory->createDb();  
 $mysql->conn();

 $sqlitFactory = new sqlitFactory();
 $sqlit = $sqlitFactory->createDb();
 $sqlit->conn();

 // 新增oracle只要新增oracle工产,和oracle数据库类,避免对原有代码的修改
 class oracle implements db
 {
    public function conn()
    {
        echo '连接oracle';
    }
 }

 class oracleFactory implements dbFactory
 {
     public function createDb()
     {
         return new oracle;
     }
 }

 $oracleFactory = new oracleFactory();
 $oracle = $oracleFactory->createDb();
 $oracle->conn();

  

原文地址:https://www.cnblogs.com/xiangdongsheng/p/13340104.html