<?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();