PHP設計模式之原廠模式和原型模式

來源:互聯網
上載者:User

標籤:php 設計模式 原型模式

這兩個模式都是針對對象建立和複用的,只是一種設計風格,在建立對象的,隨時都可以改進現有的代碼。畢竟老代碼很多地方不容易更改了,所以這兩個模式一般適合新加進去,比較容易建立對象或者使用新對象


再者就是。。。算了


我想說的就是JS,把原型做的爐火純青,我一直很癡迷,很多原型都深深的嵌入到語言的核心。


推薦那本書<你不知道的JS>


上代碼

<?phpinterface Prototype{public function shallowCopy();public function deepCopy();}class ConcretePrototype implements Prototype{private $_name;public function __construct($name){$this->_name = $name;}public function setName($name){$this->_name = $name;}public function shallowCopy(){//在php語言中,用簡單的指派陳述式是不能滿足這種需求的。要滿足這種需求雖然有很多途徑,但實現clone()方法是其中最簡單,也是最高效的手段。//如果定義了__clone()方法,則新建立的對象(複製產生的對象)中的__clone()方法會被調用, 可用於修改屬性的值//你要先new對象才能clone,一個是執行個體化,一個是複製//對象的複製是通過關鍵字 clone 來實現的。用 clone 複製出來的對象與原對象沒有任何關係,它是把原來的對象從當前的位置重新複製了一份,也就是相當於在記憶體中新開闢了一塊空間return clone $this;}public function deepCopy(){//序列化深拷貝:利用序列化來做深拷貝,把對象寫到流裡的過程是序列化的過程,這一過程稱為“冷凍”或“醃鹹菜”,還原序列化對象的過程叫做“解凍”或“回鮮”。這種深複製比較簡單//當數組值包含如雙引號、單引號或冒號等字元時,它們被還原序列化後,可能會出現問題。為了克服這個問題,一個巧妙的技巧是使用base64_encode和base64_decode。//但是base64編碼將增加字串的長度。為了克服這個問題,可以和gzcompress一起使用。 //base64_encode(gzcompress(serialize($obj)));序列化//unserialize(gzuncompress(base64_decode($txt)));還原序列化$serialize_obj = serialize($this);$clone_obj = unserialize($serialize_obj);return $clone_obj;}public function getName(){return $this->_name;}}//上面的原型基本上就寫完了class Demo{public $string;}class UsePrototype{public function shallow(){$demo = new Demo();$demo->string = "susan";//建立$object_shallow_first = new ConcretePrototype($demo);//淺複製$object_shallow_second = $object_shallow_first->shallowCopy();//之下代碼可以刪除echo ‘新對象:<br/>‘;var_dump($object_shallow_first->getName());        echo ‘淺複製的對象<br/>‘;        var_dump($object_shallow_second->getName());        echo ‘<br/>‘;        $demo->string = "jack";                echo ‘我改變建立的對象屬性:<br/>‘;        var_dump($object_shallow_first->getName());        echo ‘淺複製是同一塊記憶體,受影響<br/>‘;        var_dump($object_shallow_second->getName());        echo ‘<br/>‘;}public function deep(){//建立對象,建構函式沒參數就不用帶括弧$demo = new Demo;$demo->string = "Siri";//建立$object_shallow_first = new ConcretePrototype($demo);//淺複製$object_shallow_second = $object_shallow_first->deepCopy();//之下代碼可以刪除echo ‘新對象:<br/>‘;var_dump($object_shallow_first->getName());        echo ‘深複製的對象<br/>‘;        var_dump($object_shallow_second->getName());        echo ‘<br/>‘;        $demo->string = "jack";                echo ‘我改變建立的對象屬性:<br/>‘;        var_dump($object_shallow_first->getName());        echo ‘深複製是完全新的對象,不受影響<br/>‘;        var_dump($object_shallow_second->getName());        echo ‘<br/>‘;}}//調用$up = new UsePrototype;$up->shallow();echo ‘<hr>‘;$up->deep();//原型模式的主要思想是基於現有的對象複製一個新的對象出來,一般是用對象內部提供的複製方法,通過該方法返回一個對象的副本,這種建立對象的方式,相比我們之前說的幾類建立型模式還是有區別的,之前的講述的Factory 方法模式與抽象工廠都是通過工廠封裝具體的 new 操作的過程,返回一個新的對象,有的時候我們通過這樣的建立工廠建立對象不值得,特別是以下的幾個情境,可能使用原型模式更簡單、效率更高://如果說我們的物件類型不是剛開始就能確定,而是在運行時確定的話,那麼我們通過這個類型的對象複製出一個新的類型更容易。//有的時候我們可能在實際的項目中需要一個對象在某個狀態下的副本,這個前提很重要,這點怎麼理解呢,例如有的時候我們需要對比一個對象經過處理後的狀態和處理前的狀態是否發生過改變,可能我們就需要在執行某段處理之前,複製這個對象此時狀態的副本,然後等執行後的狀態進行相應的對比,這樣的應用在項目中也是經常會出現的。//當我們處理的對象比較簡單,並且對象之間的區別很小,可能只是很固定的幾個屬性不同的時候,使用原型模式更合適。?>



願法界眾生,皆得安樂

本文出自 “一站式解決方案” 部落格,請務必保留此出處http://10725691.blog.51cto.com/10715691/1954805

PHP設計模式之原廠模式和原型模式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.