《设计模式 - 抽象工厂》

 

被莆田卖鞋的气死,第一次在微商上买鞋就这样,也是自己太傻,太容易就相信了。

 

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

 

github

 

posted @ 2018-12-05 20:54  Zzz哈  Views(115)  Comments(0Edit  收藏  举报