PHP設計模式之原型模式

來源:互聯網
上載者:User

概念

用原型執行個體指定建立對象的種類,並且通過拷貝這些原型建立新的對象。

Prototype原型模式是一種建立型設計模式,Prototype模式允許一個對象再建立另外一個可定製的對象,根本無需知道任何如何建立的細節。

工作原理

通過將一個原型對象傳給那個要發動建立的對象,這個要發動建立的對象通過請求原型對象拷貝它們自己來實施建立。

解決什麼問題

它主要面對的問題是:“某些結構複雜的對象”的建立工作;由於需求的變化,這些對象經常面臨著劇烈的變化,但是他們卻擁有比較穩定一致的介面。

角色

抽象原型(Prototype)角色:聲明一個複製自身的介面

具體原型(Concrete Prototype)角色:實現一個複製自身的操作

結構圖

代碼

淺copy模式

直接copy,拷貝了來源物件的引用地址等,所以原來內容變化,新內容變化。

<?phpheader('Content-type:text/html;charset=utf-8');/** * PHP原型模式-潛拷貝 *//** * Interface Prototype 抽象原型模式 */interface Prototype{    // 定義拷貝自身方法啊    public function copy();}/** * Class ConcretePrototype 具體原型模式 */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;    }    /**     * 拷貝自身     *     * @return ConcretePrototype 返回自身     */    public function copy()    {        return clone $this;//淺拷貝    }}/** * 測試潛拷貝 */class LatentCopyDemo{    public $array;}/** * Class Client 用戶端 */class Client{    /**     * 測試方法     */    public static function test(){        $demo = new LatentCopyDemo();        $demo->array = array(1,2);        $object1 = new ConcretePrototype($demo);        $object2 = $object1->copy();        var_dump($object1->getName());        echo '<br/>';        var_dump($object2->getName());        echo '<br/>';        $demo->array = array(3, 4);        var_dump($object1->getName());        echo '<br />';        var_dump($object2->getName());        echo '<br />';    }}Client::test();

運行結果

object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(3) [1]=> int(4) } } object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(3) [1]=> int(4) } }

深拷貝模式

深copy通過序列化和還原序列化完成copy,新copy的內容完全複製原來的內容。原來的內容變化,新內容不變。

<?phpheader('Content-type:text/html;charset=utf-8');/** * PHP原型模式-深拷貝 *//** * Interface Prototype 抽象原型模式 */interface Prototype{    // 定義拷貝自身方法啊    public function copy();}/** * Class ConcretePrototype 具體原型模式 */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;    }    /**     * 拷貝自身     *     * @return ConcretePrototype 返回自身     */    public function copy()    {        $serialize_obj = serialize($this);        $clone_obj = unserialize($serialize_obj);        return $clone_obj;    }}/** * 測試潛拷貝 */class DeepCopyDemo{    public $array;}/** * Class Client 用戶端 */class Client{    /**     * 測試方法     */    public static function test(){        $demo = new DeepCopyDemo();        $demo->array = array(1,2);        $object1 = new ConcretePrototype($demo);        $object2 = $object1->copy();        var_dump($object1->getName());        echo '<br/>';        var_dump($object2->getName());        echo '<br/>';        $demo->array = array(3, 4);        var_dump($object1->getName());        echo '<br />';        var_dump($object2->getName());        echo '<br />';    }}Client::test();

運行結果

object(DeepCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } object(DeepCopyDemo)#4 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } object(DeepCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(3) [1]=> int(4) } } object(DeepCopyDemo)#4 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } }

優點和缺點

優點

1、可以在運行時刻增加和刪除產品
2、可以改變值以指定新對象
3、可以改變結構以指定新對象
4、減少子類的構造
5、用類動態配置應用

缺點

Prototype模式的最主要缺點就是每一個類必須配備一個複製方法。而且這個複製方法需要對類的功能進行通盤考慮,這對全新的類來說不是很難,但對已有的類進行改造時,不一定是件容易的事。

適用情境

當一個系統應該獨立於它的產品建立、構成和表示時,要使用Prototype模式

當要執行個體化的類是在運行時刻指定時,例如動態載入

為了避免建立一個與產品類層次平等的工廠類層次時;

當一個類的執行個體只能有幾個不同狀態組合中的一種時。建立相應數目的原型並複製它們可能比每次用合適的狀態手工執行個體化該類更方便一些

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.