zoukankan      html  css  js  c++  java
  • 【工厂模式】设计模式之工厂模式【原创】


    摘要:主要是参考列旭松、陈文著的《PHP核心技术与最佳实践》的2.1节。


    1.1 简介

    工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。工厂模式(Factory)允许你在代码执行时实例化对象。之所以被称为工厂模式是因为它只负责‘生产’对象。以数据库为例,工厂需要的是根据不同的参数,生产不同的实例化对象。最简单的工厂模式就是根据传入的类型名实例化对象,比如传入Mysql,就调用Mysql的类并实例化,比如传入SQLite,则调用SQLite的类并实例化,甚至可以处理TXT、EXCEL等‘类数据库’。工厂类就是这样的类,只负责生产对象,而不负责对象的具体内容。
    工厂方法让具体的对象解脱了出来,使其并不再依赖具体的类,而是抽象。

    1.2 优点

    工厂模式的优点在于创建对象上。建立一个工厂(一个函数或一个类方法)来制造新的对象,它的任务就是把对象的创建过程都封装起来,创建对象不是使用new的形式了。而是定义一个方法,用于创建对象实例。
    通俗的说,以前创建一个对象要使用new,现在把这个过程封装起来了。
    假设不使用工厂模式:那么很多地方调用类a,代码就会这样子创建一个实例:new a(),假设某天需要把a类的名称修改,意味着很多调用的代码都要修改。

    1.3 简单的工厂模式例子


    1.4 数据库适配器

    使用工厂模式定义数据库适配器,根据不同的数据库参数实例化不同的数据库类。

    定义一个数据库适配器接口,规定一些通用的方法:
    2_DriversDb_Adapter.php:
    <?php
    /**
     * Db的适配器
     */
    
    interface Db_Adapter
    {
        /**
         * 数据库连接
         * @param array $config 数据库配置
         * @return resource
         */
        public function connect($config);
    
        /**
         * 执行数据库查询
         * @param string $query 数据库查询SQL字符串
         * @return resource
         */
        public function query($query);
    }
    



    定义一个Mysql数据库的操作类(简化版),实现了数据库适配器接口:
    2_DriversDb_Adapter_Mysqli.php:

    接下来是SQLite数据库的操作类(简化版),同样实现了数据库适配器接口:
    2_DriversDb_Adapter_Sqlite.php:
    <?php
    /**
     * 定义SQLite数据库的操作类
     */
    
    require_once 'Db_Adapter.php';
    
    class Db_Adapter_Sqlite implements Db_Adapter
    {
        // 数据库连接字符串标示
        private $_dbLink;
    
        /**
         * 数据库连接函数
         * @param array $config 数据库配置
         * @return resource
         * @throws Exception
         */
        public function connect($config)
        {
            $this->_dbLink = sqlite_open($config['file'], 0666, $error);
            if ($this->_dbLink){
                return $this->_dbLink;
            }
    
            // 数据库异常
            throw new Exception($error);
        }
    
        /**
         * 执行数据库查询
         * @param string $query 数据库查询SQL字符串
         * @return bool|resource
         */
        public function query($query)
        {
            $handle = $this->_dbLink;
            $resource = @sqlite_query($query, $handle);
            if ($resource) {
                return $resource;
            } else {
                return false;
            }
        }
    }

    定义一个工厂类,根据不同的参数生成不同的数据库类,并实现简单的查询:
    2_4_sql_factory.php:

    注意:要调用时,可以这样写:
    $db = sqlFactory:factory('Mysqli');
    $db = sqlFactory:factory('Sqlite');








  • 相关阅读:
    网页表格或div层在网页中被撑开解决之道
    jquery把给定的json自动生成多级下拉框
    jquery理想菜单实现(显示全国省市区分级效果)
    正则表达式记录
    jQuery自定义插件
    js数组及其常用方法
    vue自定义组件
    GET和POST
    可变对象和不可变对象
    js 不同元素的同一属性运动
  • 原文地址:https://www.cnblogs.com/linewman/p/9918108.html
Copyright © 2011-2022 走看看