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

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

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

瀏覽:251日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99久久九九| 久久av影视| 国产精品午夜av| 国产午夜久久| 香蕉视频亚洲一级| 精品91福利视频| 亚洲欧美久久久| 精品亚洲美女网站| 麻豆精品久久| 日本在线成人| 亚洲精品一区二区妖精| 99久久亚洲精品蜜臀| 国产精品黑丝在线播放| 久久的色偷偷| 国产精品入口久久| 日韩福利视频导航| 久久久久久久久丰满| 精品久久亚洲| 麻豆91在线播放| 欧美精品99| 久久国产三级精品| 69堂精品视频在线播放| 久久午夜精品| 亚洲在线观看| 综合激情婷婷| 亚洲视频www| 香蕉视频成人在线观看| 亚洲激情国产| 亚洲一区日本| 夜夜嗨网站十八久久| 99精品视频精品精品视频| 精品午夜久久| 久久国产精品色av免费看| 在线看片福利| 高清一区二区三区av| 日韩二区三区四区| 日本少妇精品亚洲第一区| 成人精品天堂一区二区三区| 国产在视频一区二区三区吞精| 日本成人在线一区| 久久男女视频| 午夜久久久久| 一区久久精品| 亚洲香蕉久久| 欧美黄色一区| 国产精品99精品一区二区三区∴| 水蜜桃精品av一区二区| 精品福利久久久| 97视频热人人精品免费| 亚洲尤物av| 日本a口亚洲| 国产欧美久久一区二区三区| 国产精品1luya在线播放| 久久影视三级福利片| 国产精品高颜值在线观看| 精品丝袜在线| 亚洲一区日韩| 久久超级碰碰| 日韩欧美一区二区三区在线观看| 欧美亚洲tv| 日韩成人精品一区二区| 蜜桃tv一区二区三区| 欧美激情福利| 午夜久久一区| 欧美亚洲免费| 成人国产精品一区二区免费麻豆| 日韩av在线免费观看不卡| 色吊丝一区二区| 中文不卡在线| 麻豆久久久久久| 国产精品亚洲综合在线观看| 国产aⅴ精品一区二区四区| 婷婷亚洲精品| 国产麻豆精品| 国产成人a视频高清在线观看| 免费美女久久99| 亚洲人亚洲人色久| 精品三级av在线导航| 欧美片第1页| 蜜桃av一区二区三区电影| 美女视频黄免费的久久| 亚洲男人在线| 久久中文视频| 爽好久久久欧美精品| 国产九一精品| 女生影院久久| 免费日韩av片| 六月丁香综合在线视频| 婷婷六月综合| 久久爱www成人| 久久一区二区三区电影| 欧美日韩国产一区二区在线观看| 日本不卡在线视频| 精品亚洲二区| 伊人久久大香线蕉av超碰演员| 美国欧美日韩国产在线播放| 91欧美精品| 久久精品电影| 青草国产精品久久久久久| 999久久久精品国产| 91视频一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 伊人久久大香伊蕉在人线观看热v| 欧美精品黄色| 欧美丰满日韩| 亚洲精品激情| 久久中文字幕av| 成人午夜亚洲| 日本久久一区| 国产精品99久久免费| 不卡中文字幕| 一区二区三区午夜视频| 9999国产精品| 精品国产精品国产偷麻豆| 综合五月婷婷| 视频在线在亚洲| 日本不卡视频在线观看| 欧美另类专区| 成人va天堂| 国产精品xxx| 国产日本亚洲| 狠狠久久婷婷| 中文字幕在线视频久| 蜜臀国产一区| 国产剧情一区二区在线观看| 蜜桃久久av| 亚洲特色特黄| 欧美sm一区| 成人污污视频| 久久三级毛片| 国产伦理一区| 亚洲人成网站在线在线观看| 日韩另类视频| 精品72久久久久中文字幕| 中文字幕中文字幕精品| 免费一级片91| 在线视频观看日韩| 亚洲黄色免费av| 精品网站aaa| 国产精品网站在线看| 粉嫩av一区二区三区四区五区 | 桃色一区二区| 久久精品国产免费| 国产亚洲久久| 日韩国产在线一| 日本电影久久久| 日本三级亚洲精品| 人人精品久久| 久久99国产精品视频| 久久字幕精品一区| 亚洲午夜天堂| 日韩欧美一区二区三区免费观看| 视频一区日韩精品| 免费成人在线影院| 成人在线免费观看91| 国产精品九九| 日韩毛片视频| 亚洲先锋成人| 亚洲狼人精品一区二区三区| 亚洲婷婷丁香| 国产欧美日韩一区二区三区四区 | 黄色在线观看www| 日本少妇一区二区| 日韩高清不卡在线| 在线成人直播| 蜜臀久久99精品久久久久宅男| 久久国产电影| 激情五月色综合国产精品| 石原莉奈在线亚洲二区| 国产亚洲精品精品国产亚洲综合| 在线亚洲观看| 三级久久三级久久久| 国产66精品| 久久99精品久久久久久园产越南| 中文精品电影| 麻豆91在线播放| 99视频精品免费观看| 91大神在线观看线路一区| 超碰超碰人人人人精品| 天堂av在线一区| 成人污污视频| 国产一区二区三区四区五区| 国产99久久| 欧美日韩一区二区三区不卡视频 | 日韩大片在线观看| 亚洲一二av| 亚洲涩涩av| 麻豆一区在线| 狠狠爱www人成狠狠爱综合网| 亚洲欧洲日本mm| 欧美天堂一区二区| 亚洲二区免费| 欧美激情福利| 亚洲综合日韩| 日本在线啊啊| 国产亚洲一区| 99视频一区| 免费在线亚洲| 手机精品视频在线观看| 色爱综合网欧美|