PHP的3种基本设计模式-学习

大憨熊 提交于 2020-01-24 23:02:04

 

1.工厂模式,使用一个工厂方法或者类来生成对象,而不是在代码中直接new

2.单例模式,使某个类的对象只允许被创建一次

3.注册模式,用来解决全局共享和交换对象

理解:

1.工厂模式应用场景,有A、B、C、D1、D2、Factory 6个类,A、B、C中都实例化了D1,正常写法是在A,B,C中都写一次new D1,现有业务需求用D2代替D1,则需要把A,B,C中的每个D1都修改成D2,维护麻烦且易出错,工厂模式就是为解决这类问题而生,在Factory类中写一个静态方法

class Factory
{
    static function createD()
    {
        $d = new D1();
        return $d;
    }
}

A、B、C在实例化D1时只需要调用

$d = Factory::createD();

现业务需求用D2代替D1,则只需要把工厂(Factory类)的createD方法中D1改为D2即可

$d = new D2();

2.单例模式应用场景,数据库连接只需一次。有一个私有的构造方法和属性(如:$db),和一个对外的方法可获取到该类的实例

class DataBase
{
    private static $db;

    private function __construct()
    {

    }

    /**
     * 在单例模式的静态方法中判断该类是否实例化
     * @return Database
     */
    public static function getInstance()
    {
        if (self::$db){
            return self::$db;
        } else {
            self::$db = new self();
            return self::$db;
        }
    }
}

工厂类中调用DataBase类,只能调用DataBase类的getInstance()方法

class Factory
{
    static function createDatabase()
    {
        $db = DataBase::getInstance();
        return $db;
    }
}

3.注册树模式,应用场景,经过前两种模式结合,也必须要调用这个Factory类去创建对象,注册树模式就是用来解决全局共享和交换对象。实现原理,有一个受保护的静态属性$objectes,有对外的静态方法set()和get(),及_unset()

class Register
{
    protected static $objects;

    public static function set($alias, $object)
    {
        self::$objects[$alias] = $object;
    }

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

    public function _unset($alias)
    {
        unset(self::$objects[$alias]);
    }
}

调用、使用场景

Register::set('db1', Factory::createDatabase());
$db = Register::get('db1');
var_dump($db);
var_dump(get_class_methods($db));

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!