慕课网----大话PHP设计模式 三(三种基本设计模式-工厂模式,单例模式,注册树模式)

1)工厂模式:
工厂方法或者类生成对象,而不是代码中直接new
多用来生成对象
好处。如果很多个文件都使用了这个类的话,如果修改需要去每个文件下都进行修改,而使用工厂模式的话,则只用在类里面修改创建方法就好了。
很多其他高级的模式都是依赖于工厂模式的。
实现方式,就是在类里面之间实现new的方式,然后返回生成的对象就行了,这样在其他文件使用的时候,只要调用这个生成方法就好了。
Factory类


namespace Imooc;

class Factory{
    static function createDatabase(){
        $db = new Database;
        return $db;
    }
}

调用的时候:

$db = Imooc\Factory::createDatabase();//这样就能代替new的方法了

2)单例模式
使某个类或者对象仅允许创建一个
比如数据库这种的话,虽然很多地方都进行调用,这样就会连接多次数据库,会造成数据库浪费,所以数据库这样的话,使用单例模式,这样只会创建一个数据库连接。
实现方式:
通过将类的构造函数__construct方法继承然后定义为私有的方式可以让其他地方无法用new的方式实例化。
然后写一个类似getInstance的方法。这个方法就是判断是否有已有实例化的对象。如果有的话,则返回这个对象,如果没有,即第一次调用的时候,则自己用new方式实例化。

//设置一个属性方便设计模式
protected $db;
private function __construct(){
    //对构造函数进行私有话处理的,在其他文件或者类里面,如果你使用new来实例化这个类的话,会提示无法实例化
}

static function getInstance(){
    //然后通过new self这种形式来调用私有__construct的构造方法,一般new的时候调用的就是__construct的方法
    //赋值到静态属性上
    if(self::$db){
        //如果存在的话,直接返回已有的属性就好了
        //这就是单例模式的实现方式
        return self::$db;
    }else{
        self::$db = new self();
        return self::$db;
    }
}

3)注册树模式
实现全局共享,这样比如单独写一个方法的时候,不用每次都传递参数了,直接用set把他放到注册类中,然后用想调用的时候用get方法获取。
上述两个模式有个缺点的话,是必须去调用这个工厂或者单例。
建立一个register的类,然后创建一个set,get,_unset方法。
然后创建一个全局的$object类的对象,然后再set中,把东西保存到数组里。这样全局都可以使用了。


namespace Imooc;

class Register{
    protected static $objects;//加上static就不会显示黄色错误了
    static function set($alias, $object){
        //当调用这个set方法的时候,映射到$objects这个对象上
        self::$objects[$alias] = $object;
    }

    static function get($name){
        return self::$objects[$name];
    }

    function _unset($alias){
        //因为unset是php自带的函数,所以要加个下划线
        unset(self::$objects[$alias]);
    }
}

使用的时候

在工厂类中,添加一个set的方法进行保存


namespace Imooc;

class Factory{
    static function createDatabase(){
//        $db = Database::getInstance();
//        return $db;
        //注册数模式
        $db = Database::getInstance();
        //如果把对象映射到身份证上面。这样在其他文件调用的时候只用调用一次
        Register::set('db1', $db);
        return $db;
    }
}

然后在index.php中调用的时候时候,调用get方法就能获取对象了。

$db = \Imooc\Register::get('db1');

你可能感兴趣的:(大话PHP设计模式)