手记

【九月打卡】第3天 设计模式之工厂模式

课程名称:大话PHP设计模式

课程章节:工厂模式

课程讲师:Rango

课程内容:

特点

  • 由一个工厂类来管理项目中所有生成类的对象的代码

优点

  • 当项目中有多处使用new实例化类时,如果要修改实例化的类,会比较麻烦;而使用工厂模式后,只需要在工厂类中修改一处即可

工厂模式的类型

  • 工厂模式有多种类型(简单工程模式、工厂方法模式、抽象工厂模式),这里介绍为简单工厂模式,我还不清楚其它几种类型在项目中的实际作用

代码

class User{
  public function getUserName() {
    return "小明";
  }
}

class Factory{
  static public function createUser() {
    return new User();
  }
}

$a = Factory::createUser();
echo $a->getUserName();

// 输出:小明

User类是我们需要实例化的类,假如在项目中需要在多处实例化该类,那么当该类类名改变时,则需要在项目中多处修改该类的名字,比较麻烦。
如果使用一个工厂类来管理需要实例化的类,然后在项目的其它地方使用工厂类的方法来获取对象,可实现同样的效果,而如果要修改类名,则只需要在工厂类的方法中修改一处即可

工厂类内部的方法还有多种实现方式,比如一个php文件是一个类,文件都放到Drivers文件夹下,要扩展新的类时,只需要在该文件夹下新建对应的文件即可,比如新建了一个User文件,然后在项目中需要实例化该类的地方使用工厂类的对应方法来获取对象,具体实现如下(只看这段文字可能有点懵,可以结合代码来看)

    
<?php
class Example
{
    //带参数的工厂方法
    public static function factory($type)
    {
        if (include_once 'Drivers/' . $type . '.php') {
            $classname = 'Driver_' . $type;
            return new $classname;
        } else {
            throw new Exception('Driver not found');
        }
    }
}
// 实例化mysql类
$mysql = Example::factory('MySQL');
// 实例化sqlite类
$sqlite = Example::factory('SQLite');
?>

学设计模式学的是思想,具体的实现可以参考前人的,也可以发挥自己的奇思妙想,只要最终实现了,能写出可用性高、低耦合、优雅的代码就是好代码

课程收货

跟随Rango老师学习的第一个设计模式,除代码本身外,也学到了写代码的一些思想,以及设计模式在项目中的应用,虽然还是有些懵懂,但相信在接下来的项目实战中多运用所学到的知识一定可以掌握,活学活用!

0人推荐
随时随地看视频
慕课网APP