原型模式(Prototype Pattern):與工廠模式類(lèi)似,都是用來(lái)創(chuàng)建對(duì)象的。利用克隆來(lái)生成一個(gè)大對(duì)象,減少創(chuàng)建時(shí)的初始化等操作占用開(kāi)銷(xiāo)
為什么需要原型模式
1,有些時(shí)候,我們需要?jiǎng)?chuàng)建多個(gè)類(lèi)似的大對(duì)象。如果直接通過(guò)new對(duì)象,開(kāi)銷(xiāo)很大,而且new完還得進(jìn)行重復(fù)的初始化工作。可能把初始化工作封裝起來(lái)的,但是對(duì)于系統(tǒng)來(lái)說(shuō),你封不封裝,初始化工作還是要執(zhí)行。
2,原型模式則不同,原型模式是先創(chuàng)建好一個(gè)原型對(duì)象,然后通過(guò)clone這個(gè)原型對(duì)象來(lái)創(chuàng)建新的對(duì)象,這樣就免去了重復(fù)的初始化工作,系統(tǒng)僅需內(nèi)存拷貝即可。
<?php
/**
* 原型模式
*
* @author webff
*/
/**
//聲明一個(gè)克隆自身的接口
interface Prototype {
function copy();
}
//產(chǎn)品要實(shí)現(xiàn)克隆自身的操作
class Student implements Prototype {
//簡(jiǎn)單起見(jiàn),這里沒(méi)有使用get set
public $school;
public $major;
public $name;
public function __construct($school, $major, $name) {
$this->school = $school;
$this->major = $major;
$this->name = $name;
}
public function printInfo() {
printf("%s,%s,%sn", $this->school, $this->major, $this->name);
}
public function copy() {
return clone $this;
}
}
$stu1 = new Student('清華大學(xué)', '計(jì)算機(jī)', '張三');
$stu1->printInfo();
$stu2 = $stu1->copy();
$stu2->name = '李四';
$stu2->printInfo();
?>
這里可以看到,如果類(lèi)的成員變量非常多,如果由外部創(chuàng)建多個(gè)新對(duì)象再一個(gè)個(gè)賦值,則效率不高代碼冗余也容易出錯(cuò),通過(guò)原型拷貝復(fù)制自身再進(jìn)行微小修改就是另一個(gè)新對(duì)象了。