电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:128日期: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)當一個系統(tǒng)應該獨立于它的產品創(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允許只通過客戶注冊原型實例就可以將一個新的具體產品類并入系統(tǒng)。它比其他創(chuàng)建型模式更為靈活,因為客戶可以在運行時刻建立和刪除原型。2 ) 改變值以指定新對象: 高度動態(tài)的系統(tǒng)允許你通過對象復合定義新的行為—例如,通過為一個對象變量指定值—并且不定義新的類。你通過實例化已有類并且將這些實例注冊為客戶對象的原型,就可以有效定義新類別的對象。客戶可以將職責代理給原型,從而表現出新的行為。這種設計使得用戶無需編程即可定義新“類” 。實際上,克隆一個原型類似于實例化一個類。Prototype模式可以極大的減少系統(tǒng)所需要的類的數目。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 ]有一個運行系統(tǒng)就是使用這一方案的。

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
相關文章:
主站蜘蛛池模板: 高低温万能试验机-复合材料万能试验机-馥勒仪器 | 山楂片_雪花_迷你山楂片_山楂条饼厂家-青州市丰源食品厂 | sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | 微波萃取合成仪-电热消解器价格-北京安合美诚科学仪器有限公司 | 河南凯邦机械制造有限公司 | 金属检测机_金属分离器_检针验针机_食品药品金属检探测仪器-广东善安科技 | 济南网站建设|济南建网站|济南网站建设公司【济南腾飞网络】【荐】 | 数控车床-立式加工中心-多功能机床-小型车床-山东临沂金星机床有限公司 | 长春网站建设,五合一网站设计制作,免费优化推广-长春网站建设 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 空调风机,低噪声离心式通风机,不锈钢防爆风机,前倾皮带传动风机,后倾空调风机-山东捷风风机有限公司 | 欧景装饰设计工程有限公司-无锡欧景装饰官网 | 篷房|仓储篷房|铝合金篷房|体育篷房|篷房厂家-华烨建筑科技官网 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | CPSE安博会 | 上海办公室装修,写字楼装修—启鸣装饰设计工程有限公司 | 讲师宝经纪-专业培训机构师资供应商_培训机构找讲师、培训师、讲师经纪就上讲师宝经纪 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 厂房出售_厂房仓库出租_写字楼招租_土地出售-中苣招商网-中苣招商网 | 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 恒压供水控制柜|无负压|一体化泵站控制柜|PLC远程调试|MCGS触摸屏|自动控制方案-联致自控设备 | 上海办公室装修,写字楼装修—启鸣装饰设计工程有限公司 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 无刷电机_直流无刷电机_行星减速机-佛山市藤尺机电设备有限公司 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 威实软件_软件定制开发_OA_OA办公系统_OA系统_办公自动化软件 | 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | 老城街小面官网_正宗重庆小面加盟技术培训_特色面馆加盟|牛肉拉面|招商加盟代理费用多少钱 | 建筑资质代办-建筑企业资质代办机构-建筑资质代办公司 | [品牌官网]贵州遵义双宁口腔连锁_贵州遵义牙科医院哪家好_种植牙_牙齿矫正_原华美口腔 | 安规电容|薄膜电容|陶瓷电容|智旭JEC安规电容厂家 | 光栅尺_Magnescale探规_磁栅尺_笔式位移传感器_苏州德美达 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 北京浩云律师事务所-企业法律顾问_破产清算等公司法律服务 | 杰福伦_磁致伸缩位移传感器_线性位移传感器-意大利GEFRAN杰福伦-河南赉威液压科技有限公司 | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 华中线缆有限公司-电缆厂|电缆厂家|电线电缆厂家 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 捆扎机_气动捆扎机_钢带捆扎机-沈阳海鹞气动钢带捆扎机公司 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 |