成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

PHP設計模式(四)原型模式Prototype實例詳解【創建型】

瀏覽:206日期:2022-09-10 15:01:08

本文實例講述了PHP設計模式:原型模式Prototype。分享給大家供大家參考,具體如下:

1. 概述

我們都知道,創建型模式一般是用來創建一個新的對象,然后我們使用這個對象完成一些對象的操作,我們通過原型模式可以快速的創建一個對象而不需要提供專門的new()操作就可以快速完成對象的創建,這無疑是一種非常有效的方式,快速的創建一個新的對象。

例子1:孫悟空拔下一嘬猴毛,輕輕一吹就會變出好多的孫悟空來。

例子2:寄個快遞

下面是一個郵寄快遞的場景:“給我寄個快遞。”顧客說。“寄往什么地方?寄給……?”你問。“和上次差不多一樣,只是郵寄給另外一個地址,這里是郵寄地址……”顧客一邊說一邊把寫有郵寄地址的紙條給你。“好!”你愉快地答應,因為你保存了用戶的以前郵寄信息,只要復制這些數據,然后通過簡單的修改就可以快速地創建新的快遞數據了。

2. 問題

當對象的構造函數非常復雜,在生成新對象的時候非常耗時間、耗資源的情況?我們是怎么來創建呢?

3. 解決方案

通過復制(克隆、拷貝)一個指定類型的對象來創建更多同類型的對象。這個指定的對象可被稱為“原型”對象,也就是通過復制原型對象來得到更多同類型的對象。即原型設計模式。在php的很多模板庫,都用到clone。如smarty等。

4. 適用性

原型模式的主要思想是基于現有的對象克隆一個新的對象出來,一般是有對象的內部提供克隆的方法,通過該方法返回一個對象的副本,這種創建對象的方式,相比我們之前說的幾類創建型模式還是有區別的,之前的講述的工廠模式與抽象工廠都是通過工廠封裝具體的new操作的過程,返回一個新的對象,有的時候我們通過這樣的創建工廠創建對象不值得,特別是以下的幾個場景的時候,可能使用原型模式更簡單也效率更高。

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

• 2)當要實例化的類是在運行時刻指定時,例如,通過動態裝載;

• 3)為了避免創建一個與產品類層次平行的工廠類層次時

• 4)當一個類的實例只能有幾個不同狀態組合中的一種時。建立相應數目的原型并克隆它們可能比每次用合適的狀態手工實例化該類更方便一些。(也就是當我們在處理一些對象比較簡單,并且對象之間的區別很小,可能只是很固定的幾個屬性不同的時候,可能我們使用原型模式更合適)。

5. 結構

原型模式結構如下頁上圖所示:

PHP設計模式(四)原型模式Prototype實例詳解【創建型】

6. 組成

客戶(Client)角色:使用原型對象的客戶程序抽象原型(Prototype)角色:規定了具體原型對象必須實現的接口(如果要提供深拷貝,則必須具有實現clone的規定)具體原型(ConcretePrototype):從抽象原型派生而來,是客戶程序使用的對象,即被復制的對象。此角色需要實現抽象原型角色所要求的接口。

7. 效果

Prototype模式有許多和Abstract Factory模式 和 Builder模式一樣的效果:它對客戶隱藏了具體的產品類,因此減少了客戶知道的名字的數目。此外,這些模式使客戶無需改變即可使用與特定應用相關的類。

下面列出Prototype模式的另外一些優點。

1 ) 運行時刻增加和刪除產品: Prototype允許只通過客戶注冊原型實例就可以將一個新的具體產品類并入系統。它比其他創建型模式更為靈活,因為客戶可以在運行時刻建立和刪除原型。2 ) 改變值以指定新對象: 高度動態的系統允許你通過對象復合定義新的行為—例如,通過為一個對象變量指定值—并且不定義新的類。你通過實例化已有類并且將這些實例注冊為客戶對象的原型,就可以有效定義新類別的對象。客戶可以將職責代理給原型,從而表現出新的行為。這種設計使得用戶無需編程即可定義新“類” 。實際上,克隆一個原型類似于實例化一個類。Prototype模式可以極大的減少系統所需要的類的數目。3) 改變結構以指定新對象:許多應用由部件和子部件來創建對象。4) 減少子類的構造 Factory Method 經常產生一個與產品類層次平行的 Creator類層次。Prototype模式使得你克隆一個原型而不是請求一個工廠方法去產生一個新的對象。因此你根本不需要Creator類層次。這一優點主要適用于像 C + +這樣不將類作為一級類對象的語言。像Smalltalk和Objective C這樣的語言從中獲益較少,因為你總是可以用一個類對象作為生成者。在這些語言中,類對象已經起到原型一樣的作用了。5) 用類動態配置應用 一些運行時刻環境允許你動態將類裝載到應用中。在像 C + +這樣的語言中,Prototype模式是利用這種功能的關鍵。一個希望創建動態載入類的實例的應用不能靜態引用類的構造器。而應該由運行環境在載入時自動創建每個類的實例,并用原型管理器來注冊這個實例(參見實現一節) 。這樣應用就可以向原型管理器請求新裝載的類的實例,這些類原本并沒有和程序相連接。 E T + +應用框架[ W G M 8 8 ]有一個運行系統就是使用這一方案的。

Prototype的主要缺陷是每一個Prototype的子類都必須實現clone操作,這可能很困難。例如,當所考慮的類已經存在時就難以新增 clone操作。當內部包括一些不支持拷貝或有循環引用的對象時,實現克隆可能也會很困難的。

8. 實現

<?php/** * 原型模式 */ /** * 抽象原型角色 */interface Prototype { public function copy();} /** * 具體原型角色 */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 copy() { /** 深拷貝 */ return clone $this; /** 淺拷貝 */ //return $this; }} class Client { /** * Main program. */ public static function main() { $object1 = new ConcretePrototype(11); $object_copy = $object1->copy(); var_dump($object1->getName()); echo ’<br />’; var_dump($object_copy->getName()); echo ’<br />’; $object1->setName(22); var_dump($object1->getName()); echo ’<br />’; var_dump($object_copy->getName()); echo ’<br />’; }}Client::main();?>9. 淺拷貝和深拷貝

原型模式的原理圖:

PHP設計模式(四)原型模式Prototype實例詳解【創建型】

淺拷貝

被拷貝對象的所有變量都含有與原對象相同的值,而且對其他對象的引用仍然是指向原來的對象。即淺拷貝只負責當前對象實例,對引用的對象不做拷貝。

淺復制后的對象和對象副本的情況:

PHP設計模式(四)原型模式Prototype實例詳解【創建型】

深拷貝

被拷貝對象的所有的變量都含有與原來對象相同的值,除了那些引用其他對象的變量。那些引用其他對象的變量將指向一個被拷貝的新對象,而不再是原有那些被引用對象。即 深拷貝把要拷貝的對象所引用的對象也都拷貝了一次,而這種對被引用到的對象拷貝叫做間接拷貝。

深復制的對象和對象副本的情況:

PHP設計模式(四)原型模式Prototype實例詳解【創建型】

深拷貝要深入到多少層,是一個不確定的問題。

在決定以深拷貝的方式拷貝一個對象的時候,必須決定對間接拷貝的對象是采取淺拷貝還是深拷貝還是繼續采用深拷貝。

因此,在采取深拷貝時,需要決定多深才算深。此外,在深拷貝的過程中,很可能會出現循環引用的問題。

10. 帶Prototype Manager的原型模式

原型模式的第二種形式是帶原型管理器的原型模式,其UML圖如下:

PHP設計模式(四)原型模式Prototype實例詳解【創建型】

原型管理器(Prototype Manager)角色:創建具體原型類的對象,并記錄每一個被創建的對象。

下面這個例子演示了在原型管理器中存儲用戶預先定義的顏色原型,客戶通過原型管理器克隆顏色對象。

<?php/** * abstract Prototype * */abstract class ColorPrototype{ //Methods abstract function copy();} /** * Concrete Prototype * */class Color extends ColorPrototype{ //Fields private $red; private $green; private $blue; //Constructors function __construct( $red, $green, $red) { $this->red = $red; $this->green = $green; $this->blue = $red; } /** * set red * * @param unknown_type $red */ public function setRed($red) { $this->red = $red; } /** * get red * */ public function getRed(){ return $this->red; } /** *set Green * * @param $green */ public function setGreen($green) { $this->green = $green; } /** * get Green * * @return unknown */ public function getGreen() { return $this->green ; } /** *set Blue * * @param $Blue */ public function setBlue($Blue) { $this->blue = $Blue; } /** * get Blue * * @return unknown */ public function getBlue() { return $this->blue ; } /** * Enter description here... * * @return unknown */ function copy(){ return clone $this; } function display() { echo $this->red , ’,’, $this->green, ’,’, $this->blue ,’<br>’; }}/** * Enter description here... * */class ColorManager{ // Fields static $colors = array(); // Indexers public static function add($name, $value){ self::$colors[$name] = $value; } public static function getCopy($name) { return self::$colors[$name]->copy(); }}/** *Client * */class Client{ public static function Main() { //原型:白色 ColorManager::add('white', new Color( 255, 0, 0 )); //紅色可以由原型白色對象得到,只是重新修改白色: r $red = ColorManager::getCopy(’white’); $red->setRed(255); $red->display(); //綠色可以由原型白色對象得到,只是重新修改白色: g $green = ColorManager::getCopy(’white’); $green->setGreen(255); $green->display(); //綠色可以由原型白色對象得到,只是重新修改白色: b $Blue = ColorManager::getCopy(’white’); $Blue->setBlue(255); $Blue->display(); }}ini_set(’display_errors’, ’On’);error_reporting(E_ALL & ~ E_DEPRECATED);Client::Main();?>

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

標簽: PHP
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
在线中文字幕一区| 国产情侣久久| 国产精品日韩二区| 国产精品无人区| 色噜噜狠狠成人网p站| 亚洲欧美日韩国产成人精品影院| 成人久久视频在线观看| 欧美日韩第一区日日骚| 久久激情综合网| 在线观看欧美精品| 男人的天堂久久精品| 久热re这里精品视频在线6| 性做久久久久久久久| 好看不卡的中文字幕| 国产情人综合久久777777| 成人avav在线| 久久久久久久久蜜桃| 91在线小视频| 一本久久a久久免费精品不卡| 亚洲成人av一区二区| 国产亚洲综合精品| 亚洲乱码国产乱码精品精小说 | 亚洲高清激情| 亚洲激情综合网| 在线一区亚洲| 五月天激情综合网| 色吧成人激情小说| 国产一区二区在线观看免费| 91精品黄色片免费大全| 国产91精品在线观看| 欧美xxxxx裸体时装秀| aaa国产一区| 亚洲国产精品黑人久久久| 亚洲手机在线| 亚洲国产精品尤物yw在线观看| 亚洲在线日韩| 免费人成在线不卡| 538在线一区二区精品国产| 国产成人午夜99999| 日韩一区二区视频| 欧美一区影院| 亚洲少妇中出一区| 翔田千里一区二区| 麻豆精品久久精品色综合| 在线不卡中文字幕| 丁香啪啪综合成人亚洲小说 | 99re这里只有精品首页| 国产精品毛片无遮挡高清| 99国产一区| 亚洲va韩国va欧美va| 欧美中文字幕一区二区三区亚洲 | 九九精品一区二区| 精品日韩99亚洲| 国产在线一区二区三区四区| 亚洲一区二区欧美日韩 | 欧美激情视频一区二区三区免费| ...中文天堂在线一区| 免费国产自线拍一欧美视频| 免费成人在线网站| 欧美www视频| 亚洲黄色成人久久久| 日韩在线卡一卡二| 欧美疯狂做受xxxx富婆| 96av麻豆蜜桃一区二区| 亚洲黄色尤物视频| 欧美亚洲国产一区二区三区 | 久久午夜色播影院免费高清| 亚洲伦理一区| 美女脱光内衣内裤视频久久影院| 日韩一区二区三区av| 欧美精品二区三区四区免费看视频| 亚洲欧美在线aaa| 91国产精品成人| 成人精品高清在线| 亚洲色图在线看| 色噜噜久久综合| 99视频超级精品| 亚洲午夜视频在线| 欧美一级夜夜爽| 亚洲国产日韩综合一区| 免费看日韩精品| 久久久国产午夜精品 | 国内精品久久久久久久影视麻豆| 首页综合国产亚洲丝袜| 精品国精品国产尤物美女| 亚洲美洲欧洲综合国产一区| 激情综合色丁香一区二区| 国产视频在线观看一区二区三区 | 久久国产剧场电影| 国产精品天干天干在观线| 久久婷婷av| 99久久99久久综合| 香港成人在线视频| 26uuu亚洲| 久久精彩视频| 99精品一区二区三区| 午夜视频久久久久久| 久久综合狠狠综合久久激情| 国产乱人伦精品一区二区 | 欧美精品第1页| 亚洲激情av| 国产sm精品调教视频网站| 一区二区在线免费| 精品国产凹凸成av人导航| 亚洲综合精品四区| 不卡av电影在线播放| 亚洲成人一区在线| 国产亚洲精品超碰| 欧美日韩一区二区在线观看| 激情综合视频| 国产精品系列在线观看| 午夜激情一区二区| 国产日韩精品一区二区浪潮av | 亚洲视频精选在线| 精品国产一区二区三区忘忧草| 老司机一区二区三区| 91亚洲国产成人精品一区二区三 | 久久青青草原一区二区| 国模一区二区三区| 成人手机电影网| 婷婷激情综合网| 国产精品传媒入口麻豆| 91精品国产色综合久久不卡电影| 国产日韩欧美一区二区三区四区 | 日本亚洲最大的色成网站www| 日本一区二区三区高清不卡| 6080国产精品一区二区| 久久久久久精| 亚洲国产一区二区三区在线播| 成人免费看片app下载| 日本不卡中文字幕| 亚洲精品国产第一综合99久久| 久久只精品国产| 欧美日产国产精品| 亚洲一卡久久| 亚洲午夜精品一区二区| 成人国产精品免费网站| 日韩av电影一区| 亚洲人成小说网站色在线| 久久久久国产成人精品亚洲午夜| 欧美日韩国产首页| 免费永久网站黄欧美| 一区一区视频| 91女神在线视频| 国产一区二区三区在线观看免费视频| 亚洲成人在线免费| 亚洲色图欧洲色图| 亚洲国产精品成人综合色在线婷婷 | 亚洲精品一区二区三区蜜桃久| 丰满放荡岳乱妇91ww| 激情文学综合插| 日本免费新一区视频| 视频一区二区三区中文字幕| 亚洲综合男人的天堂| 亚洲私人影院在线观看| 国产精品网站导航| 久久精品亚洲麻豆av一区二区| 欧美高清dvd| 欧美日韩精品久久久| 欧洲日韩一区二区三区| 免费在线观看成人av| 国产精品久久国产三级国电话系列 | 欧美午夜一区二区三区免费大片| 久久久久久久波多野高潮日日| 亚洲综合日本| 一道本一区二区| 国产欧美日韩一区| 日韩一区二区久久| 激情欧美国产欧美| 亚洲黄色高清| 99视频一区| 国产日产高清欧美一区二区三区| 最新日韩在线| 亚洲久久在线| 亚洲影视在线| 国产精品亚洲综合色区韩国| 国产日韩一区二区三区| 国产精品夜夜夜一区二区三区尤| 一区二区av| 性刺激综合网| 色香色香欲天天天影视综合网| 91福利资源站| 欧美日韩国产免费一区二区 | 欧美性猛交xxxxxx富婆| 欧美丝袜丝交足nylons| 欧美日本视频在线| 欧美一级夜夜爽| 精品久久久久久久久久久久包黑料| 久久嫩草精品久久久精品一| 久久久久久久久久久久电影| 国产欧美一区二区精品秋霞影院| 国产精品沙发午睡系列990531| 日韩美女精品在线| 亚洲六月丁香色婷婷综合久久 | 国产不卡一区视频| 99久久精品久久久久久清纯| 欧美激情第二页| 精品福利电影| 久久婷婷一区| 欧美日韩国产首页在线观看|