php 设计模式 (单例+工厂)

1什么是设计模式?

1.1 设计模式是代码设计经验的总结。可以加快开发速度。
1.2 好处:代码重用,方便后期维护。

2常用的设计模式。
> 2.1. 单例设计模式:一个列只能创建一个对象,不管用什么方法,都无法创建第2个对象。如:数据库
>2.2 工厂设计模式:根据传递的不同的类名,生产不同类的对象的工厂。

3单例模式设计要求(三私一公)
>3.1私有的静态的保存对象的属性。

3.2私有的构造方法,阻止类外new对象。
3.3私有的克隆方法,阻止类外clone对象。

4单例举例说明:

<?php
class  Student{
    //私有的静态的保存对象的属性。
    private  static  $obj = NULL;

    //私有的构造方法:阻止类外new对象
    private function __construct(){}

    //私有的克隆方法:阻止类外clone对象
    private function __clone(){}

    //公共的静态的创建对象的方法
    public static function getInstance()
    {
        //判断当前对象是否存在
        if(!self::$obj  instanceof self)
        {
            //如果当前对象不存在,则创建它
            self::$obj = new  self;
        }
        // 返回对象
        return self::$obj;
    }
}

//测试是否是单例
$obj1 = Student::getInstance();
$obj2 = Student::getInstance();
var_dump($obj1,$obj2);

/**
 * instanceof  判断当前对象是不是某个类的对象,如果是某个类的对象,则返回true;
 * 否则返回false。
 * 
 * 语法   $obj  instanceof    className
 */

php 设计模式 (单例+工厂)

工厂设计模式

什么是工厂模式

根据传递的不同类名参数,来创建不同类的对象。实现创建不同类的对象的统一方式。

2工厂模式的设计要求

定义一个工厂类,例如:Factory.class.php
公共的静态的创建不同类的对象的方法。
该方法有一个唯一的类名参数。
向外部返回创建类的对象。
提示:工厂类本省不创建对象 。
注意:使用工厂类创建的对象的构造的方法都不能带参数。

举例说明

  1. list.php文件的代码
<?php

// (1) 类的自动加载
spl_autoload_register(function($className){
   //构建类文件的真实路径
    $filename = "./libs/$className.class.php";
    //如果类文件存在,则包含
    if(file_exists($filename)) require_once($filename);
});

//(2) 创建学生类对象
$stuObj = Factory::getInstance("Student");

// (3)创建教师类对象
$teaObj = Factory::getInstance("Teacher");

2.Factory.class.php 工厂类的文件代码

<?php

//定义最终的工厂类
final class Factory
{
    //公共的静态的创建不同类对象的方法
    public static function getInstance($className)
    {
        //创建不同类的对象,并返回
        return  new $className();
    }
}

(3)Student.class.php学生类文件代码

<?php

//定义最终的学生类
final  class Student
{
    private $name = "张三丰";
    private $age = 24;
    public function __construct()
    {
        echo "{$this->name}学生年龄是{$this->age}岁";
    }
}


(4) Teacher.class.php教师类的文件代码

//定义最终的教师类
final class Teacher
{
    private $name = "张三疯";
    private $school = "美国斯坦福大学";

    public function __construct()
    {
        echo "{$this->name}老师毕业于{$this->school}";
    }
}