zoukankan      html  css  js  c++  java
  • 《设计模式

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

    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

  • 相关阅读:
    window系统之mongoDB安装,启动及如何设置为windows服务(总结)
    永久激活pycharm 教程,方便,快捷,简单
    python classmethod方法 和 staticmethod
    Python 单元测试 之setUP() 和 tearDown()
    Git 自己的一些工作中的总结
    __str__ 和 __unicode__ 的区别和用法
    Bug 汇总
    如何理解API,API 是如何工作的
    AJAX
    集群配置虚拟主机及部署Hadoop集群碰到的问题
  • 原文地址:https://www.cnblogs.com/25-lH/p/10073350.html
Copyright © 2011-2022 走看看