用原型实例指定创建对象的种类,并且拷贝这些原型创建新的对象.
应用场景:
A.用new创建对象通常有较为复杂的数据准备或权限准备
B.对象较大,拷贝对象可以节省内存
UML图:
class WorkExperience { private $workTime; private $workAddress; public function __construct($workTime, $workAddress) { $this->workTime = $workTime; $this->workAddress = $workAddress; } /** * @return mixed */ public function getWorkTime() { return $this->workTime; } /** * @return mixed */ public function getWorkAddress() { return $this->workAddress; } /** * @param mixed $workTime */ public function setWorkTime($workTime) { $this->workTime = $workTime; } /** * @param mixed $workAddress */ public function setWorkAddress($workAddress) { $this->workAddress = $workAddress; } } abstract class Prototype { protected $age; protected $name; protected $workExperience; public function __clone() { $this->workExperience = clone $this->workExperience; //将对象深拷贝 } } class Resume extends Prototype { public function __construct($name) { $this->name = $name; } /** * @return mixed */ public function getAge() { return $this->age; } /** * @param mixed $age */ public function setAge($age) { $this->age = $age; } /** * @return mixed */ public function getName() { return $this->name; } /** * @param mixed $name */ public function setName($name) { $this->name = $name; } /** * @return mixed */ public function getWorkExperience() { return $this->workExperience; } /** * @param mixed $workExperience */ public function setWorkExperience(WorkExperience $workExperience) { $this->workExperience = $workExperience; } } $workExp = new WorkExperience('2013-2015', ' A commpany'); $resumeA = new Resume("jack"); $resumeA->setAge(23); $resumeA->setWorkExperience($workExp); $resumeB = clone $resumeA; $workExp->setWorkTime('2016-2017'); $resumeA->setWorkExperience($workExp); echo $resumeA->getName() . PHP_EOL; echo $resumeA->getAge() . PHP_EOL; echo $resumeA->getWorkExperience()->getWorkTime() ; echo $resumeA->getWorkExperience()->getWorkAddress() . PHP_EOL; echo $resumeB->getWorkExperience()->getWorkTime() ; echo $resumeB->getWorkExperience()->getWorkAddress() . PHP_EOL;