原型模式(Prototype Pattern):與工廠模式類似,都是用來創(chuàng)建對象的勋又。利用克隆來生成一個大對象涯穷,減少創(chuàng)建時的初始化等操作占用開銷
為什么需要原型模式
1,有些時候柱恤,我們需要創(chuàng)建多個類似的大對象数初。如果直接通過new對象,開銷很大梗顺,而且new完還得進行重復(fù)的初始化工作泡孩。可能把初始化工作封裝起來的寺谤,但是對于系統(tǒng)來說仑鸥,你封不封裝,初始化工作還是要執(zhí)行变屁。
2眼俊,原型模式則不同,原型模式是先創(chuàng)建好一個原型對象粟关,然后通過clone這個原型對象來創(chuàng)建新的對象疮胖,這樣就免去了重復(fù)的初始化工作,系統(tǒng)僅需內(nèi)存拷貝即可。
<?php
/**
* 原型模式
*
* @author webff
*/
/**
//聲明一個克隆自身的接口
interface Prototype {
function copy();
}
//產(chǎn)品要實現(xiàn)克隆自身的操作
class Student implements Prototype {
//簡單起見澎灸,這里沒有使用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é)', '計算機', '張三');
$stu1->printInfo();
$stu2 = $stu1->copy();
$stu2->name = '李四';
$stu2->printInfo();
?>
這里可以看到院塞,如果類的成員變量非常多,如果由外部創(chuàng)建多個新對象再一個個賦值击孩,則效率不高代碼冗余也容易出錯迫悠,通過原型拷貝復(fù)制自身再進行微小修改就是另一個新對象了。