设计模式,依赖注入

/*单例模式(single instance)
 * 条件
 * 1.拥有一个构造函数,并且为private
 * 2.拥有一个静态成员变量用来保持类的实例
 * 3.拥有一个访问这个实例的静态方法
 */
class single
{
    static public $instance = null;

    private function __construct()
    {
        echo "new-class<br />";
    }

    public static function getInstance()
    {
        if (!self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function getAbc()
    {
        return 'abc';
    }
}

//控制器直接调用
public function single()
{
        //好处:在一个进程里面,不管你调用多少次,只会new一次
        $abc=\Single::getInstance()->getAbc();
        \Single::getInstance()->getAbc();
        \Single::getInstance()->getAbc();
        \Single::getInstance()->getAbc();
        echo $abc;
        //结果只会输出一个new-class  abc
}
/*注册树模式(register tree)
 * 描述
 * 1.注册树模式通过将对象实例注册到一个全局的对象树上
 * 2.需要的时候从对象树拿过来用
 */
class Register
{
    //注册树池子
    protected static $objects = null;

    //将对象挂到树上
    public static function set($key, $object)
    {
        self::$objects[$key] = $object;
    }

    //从树上获取对象,没有就注册
    public static function get($key)
    {
        if (!isset(self::$objects[$key])) {
            self::$objects[$key] = new $key;
        }
        return self::$objects[$key];
    }

    //注销
    public static function _unset($key)
    {
        unset(self::$objects[$key]);
    }
}

//在定义一个A类
class A
{
    public function abc()
    {
        return 'abcd';
    }
}

//控制器直接调用
public function register()
{
    $a=new \A();
    \Register::set('register',$a);
    halt(\Register::get('register')->abc());  //abcd
}
//依赖注入(控制器)
//未使用依赖注入
public function test3()
{
    $person=new \Person();
    halt($person->buy());
}

class Person
{
    public function buy()
    {
        $car = new Car();
        return $car->take();
    }
}

class Car
{
    public function take()
    {
        return '成功';
    }
}
//控制器->person类->car类,显然写死不太好, 
//使用依赖注入后

public function test3()  //修改
{
    $person=new \Person();
    $car=new \Car();
    halt($person->buy($car));
}

class Person  //修改
{
    public function buy($obj)
    {
        return $obj->take();
    }
}

class Car //car未修改
{
    public function take()
    {
        return '成功';
    }
}
赞赏

微信赞赏支付宝赞赏

发表评论