《设计模式 - 抽象工厂》
被莆田卖鞋的气死,第一次在微商上买鞋就这样,也是自己太傻,太容易就相信了。
1:我的问题?
- 在实际的开发中,如果系统需要产生一定的变动,比如从 Mysql 迁移到 MariaDB ,或者直接迁移到了 Oracle 数据库等等。
- 这时我们如果在程序中大量使用了 new Mysql() 这种语句的话,迁移就会非常困难,并且SQL语句也会有一些不兼容。
- 所以,我们需要一个可以随时切换数据库而不会涉及大量修改代码的情况。
2:抽象工厂模式
- 工厂模式都了解,可以实现在构建对象时候的统一化。
- 抽象工厂也是工厂模式的一种抽象化,怎么说呢,也就是说不管是哪种数据库,他都是数据库!
- 他大舅他二舅都是他舅~ 【他舅 就是抽象】
- 抽象工厂模式的好处是,更易于交换产品系列,使得创建实例和客户端分离,通过抽象操作接口,这样,即使改变数据库,也可以轻松的切换。
3:实现抽象工厂模式
- 由刚刚所说,这里构建一个抽象的[数据库]
// 工厂模式 - 规定实现 - 基础方法 interface DB { public function insert(); public function select(); }
- 这个抽象的数据库必须实现里面的方法,之后我们为这个抽象的接口,扩展自己的属性
/** * Mysql 操作类 */ class Mysql implements DB { public function insert() { echo '这里是Mysql的insert操作'; } public function select() { echo '这里是Mysql的select操作'; } } /** * Oracle 操作类 */ class Oracle implements DB { public function insert() { echo '这里是Oracle的insert操作'; } public function select() { echo '这里是Oracle的select操作'; } }
- 构建工厂
class Factory { public function __construct() { // 可以写死 - 也可以根据配置文件配置 $this->db = 'Mysql'; } /** * 创建 DB 产品 * @return MySQL|Oracle */ public function createDB() { switch ($this->db) { case 'MySQL': $db = new Mysql(); break; case 'Oracle': $db = new Oracle(); break; default: throw new \InvalidArgumentException('暂不支持的数据库类型'); } return $db; } }
- 之后我们在客户端,既可以方便的切换数据库,而不用担心产生的影响,因为所有的操作都会发到对应的工厂拓展中去执行,就可以使用db
$myDb = new Factory(); $myDb = $myDb->createDB();