书接上文,简单工厂模式。发现简单工厂模式有着致命的问题,不符合开闭原则;
所谓开闭原则,对于扩展是开放的,对于修改是关闭的,这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。
因为设计模式是从编译语言那里过来的,所以编译语言在编译后不方便修改,所以这个时候整个项目编译可能需要好几个钟,这样就不合适,所以需要考虑开闭原则以缩短项目工期。
那代码里面究竟出现了什么,为什么说不符合开闭原则,因为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();
只需要新增类,而不需要修改原来的代码,工厂方法,完成
网友评论