設(shè)計(jì)模式[創(chuàng)建型]07--原型模式(Prototype)

一败晴、簡(jiǎn)介

相比正常創(chuàng)建一個(gè)對(duì)象 (new Foo () )浓冒,首先創(chuàng)建一個(gè)原型,然后克隆它會(huì)更節(jié)省開(kāi)銷尖坤。

原型模式是先創(chuàng)建好一個(gè)原型對(duì)象稳懒,然后通過(guò)clone原型對(duì)象來(lái)創(chuàng)建新的對(duì)象。適用于大對(duì)象的創(chuàng)建慢味,因?yàn)閯?chuàng)建一個(gè)大對(duì)象需要很大的開(kāi)銷场梆,如果每次new就會(huì)消耗很大,原型模式僅需內(nèi)存拷貝即可纯路。

二或油、場(chǎng)景

比如:

  • 大量的數(shù)據(jù)對(duì)象(比如通過(guò)ORM獲取1,000,000行數(shù)據(jù)庫(kù)記錄然后創(chuàng)建每一條記錄對(duì)應(yīng)的對(duì)象實(shí)體)

三、類結(jié)構(gòu)

原型模式主要角色如下:

角色 類別 簡(jiǎn)述
Prototype 抽象原型角色 聲明一個(gè)克隆自身的接口
Concrete Prototype 具體原型角色 實(shí)現(xiàn)一個(gè)克隆自身的操作

四驰唬、UML圖

五顶岸、代碼分析

1、抽象原型角色

interface Prototype
{
    public function shallowCopy();
    public function deepCopy();
}

2叫编、具體原型角色

class ConcretePrototype implements Prototype
{
    private $_name;

    public function __construct($name){
        $this->_name = $name;
    }
    
    public function setName($name){
        $this->_name = $name;
    }

    public function getName(){
        return $this->_name;
    }

    //淺拷貝
    public function shallowCopy(){
        return clone $this; 
    }

    //深拷貝
    public function deepCopy() {
        $serialize_obj = serialize($this);
        $clone_obj = unserialize($serialize_obj);
        return $clone_obj;
    }
}

3辖佣、使用案例

class Demo
{
    public $string;
}

class UsePrototype
{

    //測(cè)試淺拷貝
    public function shallow(){
        $demo = new Demo();
        $demo->string = "susan";
        $object_shallow_first = new ConcretePrototype($demo);
        $object_shallow_second = $object_shallow_first->shallowCopy();
        
        var_dump($object_shallow_first->getName());
        echo '<br/>';
        var_dump($object_shallow_second->getName());
        echo '<br/>';
        
        $demo->string = "sacha";
        var_dump($object_shallow_first->getName());
        echo '<br/>';
        var_dump($object_shallow_second->getName());
        echo '<br/>';
        
    }
    
    //測(cè)試深拷貝
    public function deep(){
        $demo = new Demo();
        $demo->string = "Siri";
        $object_deep_first = new ConcretePrototype($demo);
        $object_deep_second = $object_deep_first->deepCopy();
    
        var_dump($object_deep_first->getName());
        echo '<br/>';
        var_dump($object_deep_second->getName());
        echo '<br/>';
    
        $demo->string = "Demo";
        var_dump($object_deep_first->getName());
        echo '<br/>';
        var_dump($object_deep_second->getName());
        echo '<br/>';
    }
  
}

$up = new \Libs\UsePrototype;
$up->shallow();
echo '<hr>';
$up->deep();

結(jié)果如下:

object(Demo)#2 (1) { ["string"]=> string(5) "susan" } 
object(Demo)#2 (1) { ["string"]=> string(5) "susan" } 
object(Demo)#2 (1) { ["string"]=> string(5) "sacha" } 
object(Demo)#2 (1) { ["string"]=> string(5) "sacha" } 
--------------------------------------------------------------
object(Demo)#5 (1) { ["string"]=> string(4) "Siri" } 
object(Demo)#8 (1) { ["string"]=> string(4) "Siri" } 
object(Demo)#5 (1) { ["string"]=> string(4) "Demo" } 
object(Demo)#8 (1) { ["string"]=> string(4) "Siri" } 

注意:在PHP中,對(duì)象本身就是引用傳遞搓逾。

六卷谈、特點(diǎn)

1、淺拷貝

被拷貝對(duì)象的所有變量都含有與原對(duì)象相同的值霞篡,而且對(duì)其他對(duì)象的引用仍然是指向原來(lái)的對(duì)象世蔗。即淺拷貝只負(fù)責(zé)當(dāng)前對(duì)象實(shí)例,對(duì)引用的對(duì)象不做拷貝朗兵。

2污淋、深拷貝

被拷貝對(duì)象的所有的變量都含有與原來(lái)對(duì)象相同的值,除了那些引用其他對(duì)象的變量矛市。那些引用其他對(duì)象的變量將指向一個(gè)被拷貝的新對(duì)象芙沥,而不再是原有那些被引用對(duì)象。

即深拷貝把要拷貝的對(duì)象所引用的對(duì)象也都拷貝了一次浊吏,而這種對(duì)被引用到的對(duì)象拷貝叫做間接拷貝。

3救氯、序列化深拷貝

利用序列化來(lái)做深拷貝找田,把對(duì)象寫(xiě)到流里的過(guò)程是序列化的過(guò)程,這一過(guò)程稱為“冷凍”或“腌咸菜”着憨,反序列化對(duì)象的過(guò)程叫做“解凍”或“回鮮”墩衙。

在PHP中使用serialize和unserialize函數(shù)實(shí)現(xiàn)序列化和反序列化。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市漆改,隨后出現(xiàn)的幾起案子心铃,更是在濱河造成了極大的恐慌,老刑警劉巖挫剑,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件去扣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡樊破,警方通過(guò)查閱死者的電腦和手機(jī)愉棱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哲戚,“玉大人奔滑,你說(shuō)我怎么就攤上這事∷成伲” “怎么了朋其?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)脆炎。 經(jīng)常有香客問(wèn)我梅猿,道長(zhǎng),這世上最難降的妖魔是什么腕窥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任粒没,我火速辦了婚禮,結(jié)果婚禮上簇爆,老公的妹妹穿的比我還像新娘癞松。我一直安慰自己,他們只是感情好入蛆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布响蓉。 她就那樣靜靜地躺著,像睡著了一般哨毁。 火紅的嫁衣襯著肌膚如雪枫甲。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天扼褪,我揣著相機(jī)與錄音想幻,去河邊找鬼。 笑死话浇,一個(gè)胖子當(dāng)著我的面吹牛脏毯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幔崖,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼食店,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼渣淤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吉嫩,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤价认,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后自娩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體用踩,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年椒功,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捶箱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡动漾,死狀恐怖丁屎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情旱眯,我是刑警寧澤晨川,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站删豺,受9級(jí)特大地震影響共虑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呀页,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一妈拌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蓬蝶,春花似錦尘分、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至缓窜,卻和暖如春定续,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背禾锤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工私股, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恩掷。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓庇茫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親螃成。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旦签,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容