日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

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

1. 概述

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

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

例子2:寄個快遞

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

2. 問題

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

3. 解決方案

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

4. 適用性

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

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

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

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

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

5. 結構

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

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

6. 組成

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

7. 效果

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

下面列出Prototype模式的另外一些優(yōu)點。

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

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

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實例詳解【創(chuàng)建型】

淺拷貝

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

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

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

深拷貝

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

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

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

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

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

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

10. 帶Prototype Manager的原型模式

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

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

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

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

<?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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产日韩欧美一区二区三区 | 日本美女一区| 国产精品极品国产中出| 国产精品一区二区av日韩在线| 91麻豆精品| 视频一区日韩精品| 日韩和欧美一区二区三区| 日韩一区二区三区在线看| 综合视频一区| 青草国产精品| 欧美激情aⅴ一区二区三区| 国产精品久久久久久久免费软件| 另类小说一区二区三区| 精品欧美日韩精品| 桃色一区二区| 中文一区二区| 日韩二区三区在线观看| 国产亚洲一区| 日韩综合一区| 欧美理论视频| 久久福利精品| 日韩1区2区3区| 国产精品v日韩精品v欧美精品网站| 久久精品免费看| 欧美亚洲国产激情| 日韩精品一级中文字幕精品视频免费观看 | 国产亚洲精aa在线看| 久久久久久久久成人| 欧美日韩视频网站| 老牛影视一区二区三区| 国产精品亚洲四区在线观看 | 麻豆一区二区三| 91精品国产乱码久久久久久久| 蜜桃久久av| 国产精品自拍区| 极品av在线| 男人的天堂亚洲一区| 日韩精品亚洲专区| 国模精品一区| 伊人精品在线| 国产探花在线精品一区二区| 国产精品毛片久久| 亚洲欧美日韩一区在线观看| 国产伦乱精品| 黄色aa久久| 在线精品视频一区| 国产aⅴ精品一区二区三区久久| 在线成人直播| 国产精品自在| 欧美日韩国产欧| 日韩av成人高清| 日韩在线看片| 中文字幕一区二区av| 精品久久网站| 欧美专区一区二区三区| 久久久91麻豆精品国产一区| 欧美日韩第一| 国产麻豆一区| 伊人成人网在线看| 久久久国产精品网站| 影音国产精品| 精品一区二区男人吃奶| 石原莉奈在线亚洲二区| 成人在线免费观看网站| 人人精品人人爱| 97人人精品| 青青草精品视频| 亚洲电影在线| 国产精品成人一区二区网站软件| 91精品福利| 老牛国内精品亚洲成av人片 | 日韩电影免费在线观看| 午夜久久av| 久久香蕉国产| 美女久久久久久| 综合激情网站| 久久精品在线| 麻豆视频观看网址久久| 视频在线观看91| 五月激情久久| 久久只有精品| 欧美日韩一区二区三区不卡视频| 欧美日韩国产一区二区三区不卡| 欧美成人aaa| 少妇精品久久久一区二区| 激情综合激情| av免费不卡国产观看| 青草久久视频| 亚洲综合日韩| 99久久九九| 久久精品欧洲| 国产精品对白| 欧美日韩1区2区3区| 国产精品日韩| 免费精品国产的网站免费观看| 国产成人免费| 欧美国产先锋| 日本视频在线一区| 一区二区亚洲视频| 尹人成人综合网| 亚洲午夜电影| 色婷婷久久久| 日韩不卡视频在线观看| 精品久久福利| 美女久久久久久 | 日韩免费精品| 综合激情一区| 国产亚洲亚洲| 99riav1国产精品视频| 久久天堂精品| 久久毛片亚洲| 日韩精品dvd| 日韩高清中文字幕一区二区| 捆绑调教日本一区二区三区| 国产一区二区三区黄网站| 国产精品久久亚洲不卡| 国产精品亚洲欧美日韩一区在线 | 999精品一区| 日本不卡免费高清视频在线| 另类小说一区二区三区| 国产精品1区| 麻豆久久一区二区| 另类综合日韩欧美亚洲| 麻豆国产欧美一区二区三区| 国产精品一级| 国产精品hd| 麻豆精品蜜桃视频网站| 红杏一区二区三区| 毛片在线网站| 丝袜av一区| 精品91久久久久| 日韩精品一区第一页| 亚洲另类视频| 日本成人在线一区| 欧美精品三级在线| 国产精品极品| 国产成人精选| 欧美日韩免费观看视频| 欧美性感美女一区二区| 91久久久精品国产| 国产亚洲在线观看| 日韩精品中文字幕吗一区二区 | 日韩超碰人人爽人人做人人添| 国产精品一区二区三区www| 久草精品视频| 日本久久成人网| 国产视频久久| 日韩精品社区| 国产欧美日韩免费观看| 韩日一区二区| 欧美影院三区| 免费人成黄页网站在线一区二区| 日韩中文字幕在线一区| 国产欧美精品久久| 国产伊人久久| 亚洲成人三区| 日本亚洲不卡| 久久香蕉精品香蕉| 久久中文字幕二区| 亚洲人www| 精品亚洲成人| 亚洲精品一区二区在线看| 日本成人中文字幕在线视频| 国产福利资源一区| 亚洲福利精品| 日本不卡视频一二三区| 精品网站aaa| 999国产精品视频| 日韩欧美中文字幕一区二区三区| 久久精品福利| 中文久久精品| 国产精品白丝av嫩草影院| 91精品推荐| 欧美日韩亚洲一区二区三区在线| 日韩深夜视频| 视频在线在亚洲| 精品一区视频| 国产亚洲欧洲| 国产精品主播| 午夜精品婷婷| 久久成人福利| 伊人成人网在线看| 免费在线亚洲欧美| 亚洲综合日韩| 国产成人精品一区二区三区在线| 一本色道精品久久一区二区三区| 国产精品久久久亚洲一区| 激情五月综合| 国产极品一区| 国产视频一区欧美| 精品一区二区男人吃奶| 亚洲一区二区三区高清不卡| 麻豆视频一区二区| 亚洲精品a级片| 精品一区av| 亚洲一二三区视频| 久久人人88| 久久一区国产| 婷婷精品在线| 国产在线欧美|