MVC框架(四)驱动类 - 工厂模式

将框架中大部分要创建的对象,都经由驱动类创建,获取,判断。这样做有如下好处:

1 统一管理所有创建的类,包括创建前处理与创建后处理

2 单一创建,防止多次创建类

实例:

<?php
/**
 *驱动类 - 工厂模式
 */
abstract class Driver  //抽象类
{
    // 配置数组
    protected static $configs = array ();
    // 实例数组
    protected static $instance = array ();
    public static function init()
    {     ........//初始化处理,可以加载类的base基类等其他操作
        $driver = get_called_class();  //获取调用的类名
        $className = $driver . ‘Base‘;
        if (! class_exists($className, false))
        {
            ........
        }
    }
    /**
     * 创建驱动实例
     *
     * @param string $name
     * @param string $alias
     * @param array $args
     * @return mixed
     */
    public static function create($name, $alias = ‘‘)
    {
        $name = ucfirst($name);
        $driver = get_called_class(); //获取调用的类名
        // 类名
        $className = $driver . $name;
        // 是否存在该类实例
        if (isset(self::$instance[$driver][$alias]))
        {
            return self::$instance[$driver][$alias]; //防止多次创建
        }
        else
        {
            // 驱动路径
            $fileName = "{$driver}/{$className}.class.php";
            // 引入驱动文件
            if (require_once $fileName)
            {
                // 实例化
                $ref = new ReflectionClass($className);  //反射类
                $args = array_slice(func_get_args(), 2); //参数隔离
                self::$instance[$driver][$alias] = $ref->newInstanceArgs($args); //反射类实例化,同时这里会调用实例化类的构造方法,并传递参数
                self::$configs[$driver][] = $className;
            }
            else
            {
                // 引入驱动失败
                return false;
            }
            // 返回实例
            return self::$instance[$driver][$alias];
        }
    }
    /**
     * 获得驱动实例,不存在返回null
     *
     * @param type $name
     * @return mixed
     */
    public static function getObj($name=‘‘)
    {
        static $driver;
        // 第一次获取当前驱动名
        if (null === $driver)
        {
            $driver = get_called_class();
        }
        if (isset(self::$instance[$driver][$name]))
        {
            return self::$instance[$driver][$name];
        }
        else
        {
            return null;
        }
    }
    public static function exists($name)
    {
        static $driver;
        // 第一次获取当前驱动名
        if (null === $driver)
        {
            $driver = get_called_class();
        }
        return isset(self::$instance[$driver][$name]);
    }

    /**
     * 获取驱动实例数量
     *
     * @return int
     */
    public static function length($name)
    {
        return count(self::$configs[$name]);
    }
}

此处用了反射类

创建的时候用:

 Db::create($option[‘type‘], $name, $option);

获取对象实例:

$obj = self::getObj($name);
时间: 2024-07-31 14:23:04

MVC框架(四)驱动类 - 工厂模式的相关文章

表驱动与工厂模式

关于表驱动 首次接触表驱动,还是在毕业不久之后.当时某部门经理给我们讲解重构,即<重构:改善既有代码的设计>一书中简化条件表达式部分,关于if语句的处理,将其替换为多态形式,例如说工厂模式.但是即使替换为工厂,switch或者if的判断依旧不能去除,那么有什么办法解决这个问题呢? 当时我还在研究STL源码,想到了traits编程技术,可以在编译期解决if的判断问题(虽然有这个想法,但是一直没有实现成功).各路大牛提出了不同的见解,大家基本上都同意一条:使用"表"来解决.当时

&quot;类工厂模式&quot;改写SqlHelper

看到标题您一定很疑惑,23种经典设计模式什么时候多了一个"类工厂模式",稍等,请听我慢慢道来. 实践是检验真理的唯一途径.最近用了"类工厂模式"改写了我公司的SqlHelper类,改写了一大半了,拿出半成品和大家一起讨论. 首先说下我们公司环境:我公司在ABC三地都有工厂,同时都有各自的DB.经过调研,ABC三地的很多网页都有可有整合在一起的地方,我负责整合三地网页. 一开始,没接触设计模式的时候.我的Sql是这样写的:"select * from &qu

自定义MVC框架之工具类-图像处理类

截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( 支持任意位置与九宫格位置 ) 2,图片缩放处理( 等比缩放,不变形裁剪 ) 1 <?php 2 3 class Image{ 4 //文件路径 5 protected $path; 6 //是否允许随机文件名称 7 protected $enableRandName; 8 //文件类型 9 pro

自定义MVC框架之工具类-模型类

截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理类 这个模型类支持以下功能: >连贯操作,js叫链式操作,连贯操作的函数可以打乱顺序,最后一个函数必须是执行语句的那个函数,如select, delete, update, add等 如 $db->table( 'user' )->where( 'id=1' )->select() 等

asp.net mvc中自行搭建实现工厂模式的spring.net+三层架构 (15-4-20)

在之前的文章中,我们已经搭好了三层框架,通过调用业务层的子接口得到实例化的业务子类,通过业务子类来调用数据访问层子接口,由子接口来实例化数据访问层子类.这里我们需要明确把框架搭这么复杂的原因是遵循了设计模式中的开闭原则:对扩展开放,对修改关闭. 搭好了框架之后,我们发现这框架并不完善:实例化对象还需要手动实现,并不能实现将对象的实例化托管.所以我们决定引入spring.net框架,它的IOC模块(依赖注入),将帮我们来完成对象的创建,管理. 1.首先我们需要在项目中引用spring.core.d

PHP框架开发第一步——工厂模式

几乎所有的PHP框架都使用单入口文件方式,也就是说所有的请求都是从index.php进入.那就必须要用到工厂模式来实现请求的分发. 例如,我们在请求这样的URL : http://www.test.com/index.php?c=User&a=index 含义是我们需要请求User控制器的index方法.也就是说index.php需要根据参数去创建User控制器的实例,并调用index方法.它好像就是实现了一个"工厂"的功能. 我们可以这样实现一个工厂类: class Fact

【设计模式】HeadFirst设计模式(四):工厂模式

设计模式要求我们不应该针对实现编程,是为了降低耦合度,提高可维护性.当程序中出现"new"的时候,就证明程序在实例化一个具体类,所以用的是实现,而不是接口.如果代码绑着具体的类会导致代码更加脆弱,缺乏弹性.比如,需要创建一"个鸡蛋饼"这个对象,首先需要创建一个饼,然后创建一个鸡蛋,再然后把鸡蛋摊在饼上边,然后给饼翻翻,几分钟后就出炉了....(有点饿).在这种情况下,新对象的建立是一个过程,如果我们需要在这个饼上边抹点辣椒酱,那肯定需要对类进行修改,违反了"

设计模式(四)简单工厂模式

相关文章 设计模式(一)设计六大原则 设计模式(二)单例模式的七种写法 设计模式(三)建造者模式 1.简单工厂模式简单介绍 定义 简单工厂模式属于创建型模式又叫做静态工厂方法模式,是由一个工厂对象决定创建出哪一种产品类的实例. 简单工厂模式结构图 Factory:工厂类,简单工厂模式的核心.它负责实现创建全部实例的内部逻辑.工厂类的创建产品类的方法能够被外界直接调用.创建所需的产品对象. IProduct:抽象产品类.简单工厂模式所创建的全部对象的父类,它负责描写叙述全部实例所共同拥有的公共接口

asp.net mvc中自行搭建实现工厂模式的spring.net+三层架构(更新)

首先附上本人托管在Github上的项目https://github.com/lichaojacobs/Tomato 接下来的三层结构都包含了父接口,子接口,父类,子类部分 1.编写数据访问层 数据访问层是对数据库的增删改查的操作.首先我们在数据访问层的父接口声明一些通用的对数据库统一处理的方法: 然后是业务层子接口(对应于你的数据实体模型中的Model,下面是我的项目中的Model,仅供参考),让它继承自业务层父接口 写完接口,接下来编写父接口的实现父类BaseDAL.cs 注意,在这里是通过一