php 设计模式之 原型,克隆



1. 原型模式

原型模式又称克隆模式

对对象进行克隆,但是又把被克隆的对象称之为最初的原型,或者实例化过后的对象


2. 实列


interface ServiceProvicer {
    public function getSystem();
}

class ChinaMobile implements ServiceProvicer {
    public $system;
    public function getSystem(){
        return "中国移动" . $this->system;
    }
}
class ChinaUnicom implements ServiceProvicer {
    public $system;
    public function getSystem(){
        return "中国联通" . $this->system;
    }
}

class Phone {
    public $service_province;
    public $cpu;
    public $rom;
}

class CMPhone extends Phone {
    function __clone()
    {
        // $this->service_province = new ChinaMobile(); // 浅复制
        // 被复制对象的所有变量与原来对象值相同
    }
}

class CUPhone extends Phone {
    function __clone()
    {
        $this->service_province = new ChinaUnicom(); // 深复制
        // 把引用对象的变量指向复制过的新对象
    }
}


$cmPhone = new CMPhone();
$cmPhone->service_province = new ChinaMobile();
$cmPhone->service_province->system = 'TD-CDMA';
$cmPhone1 = clone $cmPhone;  // 复制原型,浅复制
$cmPhone1->service_province->system = 'TD-CDMA2';


echo $cmPhone->service_province->getSystem();    // 中国移动TD-CDMA2
echo $cmPhone1->service_province->getSystem();    // 中国移动TD-CDMA2

$cuPhone = new CUPhone();
$cuPhone->service_province = new ChinaUnicom();
$cuPhone->service_province->system = 'WCDMA';
$cuPhone1 = clone $cuPhone;  // 复制原型,深复制
$cuPhone1->service_province->system = 'WCDMA1';

echo $cuPhone->service_province->getSystem();    // 中国联通WCDMA
echo $cuPhone1->service_province->getSystem();    // 中国联通WCDMA1

3. 使用场景

  1. 减少创建对象时的开销
posted @ 2020-12-29 17:28  linsonga  阅读(64)  评论(0)    收藏  举报