现在我们有那么一段代码,这段代码没啥功能,两个类,分别代表了两种数据库连接,当调用不同的数据库的时候调用不同的类,这本身没什么问题,但是考虑到调用方的人不应该能看到连接的具体类是什么,我们应该只暴露方法,而不是将类名暴露。
class Mysql
{
public function conn()
{
echo 'mysql已连接';
echo '<br>';
}
}
class Oracle
{
public function conn()
{
echo 'oracle已连接';
echo '<br>';
}
}
$mysql = new Mysql();
$mysql->conn();
$oracle = new Oracle();
$oracle->conn();
所以代码改进一下,让调用端的人只需要知道conn函数可以连接数据库即可
class Mysql
{
public function conn()
{
echo 'mysql已连接';
echo '<br>';
}
}
class Oracle
{
public function conn()
{
echo 'oracle已连接';
echo '<br>';
}
}
class Database
{
public function factory($databasename)
{
i\($databasename=='oracle')
{
$oracle = new Oracle();
return $oracle;
}else if($databasename=='mysql')
{
$mysql= new Mysql();
return \$mysql;
}
}
}
$mysql = new Database();
$mysql = $mysql->factory('mysql');
$mysql->conn();
$oracle = new Database();
$oracle = $oracle->factory('oracle');
$oracle->conn();
这个时候我们只需要知道有一个类的方法,根据传入的参数获取连接,然后他们所有的连接都有同一个conn连接函数,这样说暴露出来的接口,就只有conn函数一个。
但是问题来了,为什么是conn函数?同样是数据库相关的类当然是conn函数,但是,这样无法统一他们函数上面的调用,所以这里边应该在父类有一个接口,然后子类进行继承实现,这样我就不需要知道子类具体有什么类,我只需要知道父类有什么接口就可以了
interface Db
{
public function conn();
}
class Mysql implements Db
{
public function conn()
{
echo 'mysql已连接';
echo '<br>';
}
}
class Oracle implements Db
{
public function conn()
{
echo 'oracle已连接';
echo '<br>';
}
}
class Database
{
public function factory($databasename)
{
if($databasename=='oracle')
{
$oracle = new Oracle();
return $oracle;
}else if($databasename=='mysql')
{
$mysql= new Mysql();
return $mysql;
}
}
}
$mysql = new Database();
$mysql = $mysql->factory('mysql');
$mysql->conn();
$oracle = new Database();
$oracle = $oracle->factory('oracle');
$oracle->conn();
···
网友评论