婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > PHP設(shè)計(jì)模式(四)原型模式Prototype實(shí)例詳解【創(chuàng)建型】

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

熱門標(biāo)簽:辦理400電話哪家好點(diǎn) 正規(guī)電銷機(jī)器人系統(tǒng) 南寧電話外呼系統(tǒng)線路 嘟嘟云外呼系統(tǒng) 重慶外呼電銷系統(tǒng)多少錢 濟(jì)源百應(yīng)電銷機(jī)器人聯(lián)系方式 南京3D地圖標(biāo)注 咸陽(yáng)電銷 邢臺(tái)400電話辦理

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

1.   概述

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

例子1:孫悟空拔下一嘬猴毛,輕輕一吹就會(huì)變出好多的孫悟空來(lái)。

例子2:寄個(gè)快遞

下面是一個(gè)郵寄快遞的場(chǎng)景:
“給我寄個(gè)快遞。”顧客說。
“寄往什么地方?寄給……?”你問。
“和上次差不多一樣,只是郵寄給另外一個(gè)地址,這里是郵寄地址……”顧客一邊說一邊把寫有郵寄地址的紙條給你。
“好!”你愉快地答應(yīng),因?yàn)槟惚4媪擞脩舻囊郧班]寄信息,只要復(fù)制這些數(shù)據(jù),然后通過簡(jiǎn)單的修改就可以快速地創(chuàng)建新的快遞數(shù)據(jù)了。

2. 問題

當(dāng)對(duì)象的構(gòu)造函數(shù)非常復(fù)雜,在生成新對(duì)象的時(shí)候非常耗時(shí)間、耗資源的情況?我們是怎么來(lái)創(chuàng)建呢?

3. 解決方案

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

4. 適用性

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

• 1)當(dāng)一個(gè)系統(tǒng)應(yīng)該獨(dú)立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時(shí),要使用 Prototype模式

• 2)當(dāng)要實(shí)例化的類是在運(yùn)行時(shí)刻指定時(shí),例如,通過動(dòng)態(tài)裝載;

• 3)為了避免創(chuàng)建一個(gè)與產(chǎn)品類層次平行的工廠類層次時(shí)

• 4)當(dāng)一個(gè)類的實(shí)例只能有幾個(gè)不同狀態(tài)組合中的一種時(shí)。建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實(shí)例化該類更方便一些。(也就是當(dāng)我們?cè)谔幚硪恍?duì)象比較簡(jiǎn)單,并且對(duì)象之間的區(qū)別很小,可能只是很固定的幾個(gè)屬性不同的時(shí)候,可能我們使用原型模式更合適)。

5. 結(jié)構(gòu)

     原型模式結(jié)構(gòu)如下頁(yè)上圖所示:

6. 組成

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

7. 效果

Prototype模式有許多和Abstract Factory模式 和 Builder模式一樣的效果:它對(duì)客戶隱藏了具體的產(chǎn)品類,因此減少了客戶知道的名字的數(shù)目。此外,這些模式使客戶無(wú)需改變即可使用與特定應(yīng)用相關(guān)的類。

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

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

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

8. 實(shí)現(xiàn)

?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. 淺拷貝和深拷貝

原型模式的原理圖:

淺拷貝

被拷貝對(duì)象的所有變量都含有與原對(duì)象相同的值,而且對(duì)其他對(duì)象的引用仍然是指向原來(lái)的對(duì)象。即淺拷貝只負(fù)責(zé)當(dāng)前對(duì)象實(shí)例,對(duì)引用的對(duì)象不做拷貝。

淺復(fù)制后的對(duì)象和對(duì)象副本的情況:

深拷貝

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

深復(fù)制的對(duì)象和對(duì)象副本的情況:

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

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

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

10. 帶Prototype Manager的原型模式

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

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

       下面這個(gè)例子演示了在原型管理器中存儲(chǔ)用戶預(yù)先定義的顏色原型,客戶通過原型管理器克隆顏色對(duì)象。

?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 ));
 
 //紅色可以由原型白色對(duì)象得到,只是重新修改白色: r
 $red = ColorManager::getCopy('white');
 $red->setRed(255);
 $red->display();
 
 //綠色可以由原型白色對(duì)象得到,只是重新修改白色: g
 $green = ColorManager::getCopy('white');
 $green->setGreen(255);
 $green->display();
 
 //綠色可以由原型白色對(duì)象得到,只是重新修改白色: b
 $Blue = ColorManager::getCopy('white');
 $Blue->setBlue(255);
 $Blue->display();
 }
}
ini_set('display_errors', 'On');
error_reporting(E_ALL  ~ E_DEPRECATED);
Client::Main();
?>

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見數(shù)據(jù)庫(kù)操作技巧匯總》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • PHP設(shè)計(jì)模式之原型模式示例詳解
  • PHP設(shè)計(jì)模式之命令模式示例詳解
  • PHP設(shè)計(jì)模式(三)建造者模式Builder實(shí)例詳解【創(chuàng)建型】
  • PHP設(shè)計(jì)模式(一)工廠模式Factory實(shí)例詳解【創(chuàng)建型】
  • PHP設(shè)計(jì)模式概論【概念、分類、原則等】
  • PHP設(shè)計(jì)模式之 策略模式Strategy詳解【對(duì)象行為型】
  • PHP設(shè)計(jì)模式入門之狀態(tài)模式原理與實(shí)現(xiàn)方法分析
  • PHP設(shè)計(jì)模式入門之迭代器模式原理與實(shí)現(xiàn)方法分析
  • PHP設(shè)計(jì)模式之迭代器模式Iterator實(shí)例分析【對(duì)象行為型】
  • php設(shè)計(jì)模式之適配器模式實(shí)例分析【星際爭(zhēng)霸游戲案例】
  • php設(shè)計(jì)模式之迭代器模式實(shí)例分析【星際爭(zhēng)霸游戲案例】
  • 詳解PHP八大設(shè)計(jì)模式

標(biāo)簽:唐山 平頂山 通遼 武漢 隴南 河南 黃山 南通

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP設(shè)計(jì)模式(四)原型模式Prototype實(shí)例詳解【創(chuàng)建型】》,本文關(guān)鍵詞  PHP,設(shè)計(jì)模式,四,原型,模式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP設(shè)計(jì)模式(四)原型模式Prototype實(shí)例詳解【創(chuàng)建型】》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于PHP設(shè)計(jì)模式(四)原型模式Prototype實(shí)例詳解【創(chuàng)建型】的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    综合久久综合久久| 在线看不卡av| 中文字幕一区免费在线观看| 91精品国产综合久久久蜜臀粉嫩 | 色综合久久九月婷婷色综合| 国产一区二区在线视频| 性久久久久久久久久久久| 国产精品久久久久久久久免费相片 | 1024亚洲合集| 久久久久久久久久看片| 日韩一级大片在线| 欧美一区中文字幕| 欧美日本一道本在线视频| 色视频成人在线观看免| 一本久道中文字幕精品亚洲嫩| 成人av电影免费在线播放| 国产成都精品91一区二区三| 国产精品亚洲午夜一区二区三区| 免费视频一区二区| 久久疯狂做爰流白浆xx| 亚洲成av人综合在线观看| 中文字幕在线不卡国产视频| 精品国产人成亚洲区| 欧美写真视频网站| 91污片在线观看| 国产成人免费av在线| 国产高清成人在线| 99视频在线观看一区三区| 国产91精品一区二区麻豆亚洲| 国产精品一区二区男女羞羞无遮挡 | 欧美日韩在线播放| 欧美一区二区三区在线看| 欧美一区二区视频在线观看 | 亚洲美女免费视频| 三级一区在线视频先锋 | 麻豆精品在线看| 精品一区二区精品| 国产成人鲁色资源国产91色综| 成人免费av网站| 欧美性生活大片视频| 欧美大片顶级少妇| 国产精品久久久爽爽爽麻豆色哟哟 | 国产欧美精品一区aⅴ影院| 中文字幕亚洲电影| 一区二区三区日韩在线观看| 午夜久久久影院| 国产91精品免费| 欧美色图天堂网| 欧美一区二区三区精品| 国产欧美一区二区精品仙草咪| 有码一区二区三区| 国产精品一区二区在线播放| 在线一区二区三区四区| 久久综合色综合88| 亚洲一级在线观看| 国产91丝袜在线播放0| 欧洲在线/亚洲| 久久精品夜色噜噜亚洲aⅴ| 亚洲国产日日夜夜| 粉嫩嫩av羞羞动漫久久久| 欧美日韩一区中文字幕| 国产精品欧美经典| 久久国产尿小便嘘嘘| 欧美三电影在线| 中文字幕国产精品一区二区| 婷婷久久综合九色综合绿巨人| 国产美女在线精品| 制服丝袜一区二区三区| 亚洲人成在线观看一区二区| 国产精品一区在线观看乱码| 日韩一级免费观看| 亚洲成人精品影院| 色婷婷激情综合| 中文字幕不卡在线观看| 精品一区二区在线视频| 欧美撒尿777hd撒尿| 亚洲欧美一区二区久久 | 国产一区二区精品久久| 欧美一二三区精品| 午夜精品久久久久久不卡8050| 99久久精品一区二区| 国产欧美久久久精品影院| 激情成人午夜视频| 精品久久久久久久人人人人传媒| 日韩黄色小视频| 制服丝袜中文字幕亚洲| 性久久久久久久| 欧美日韩不卡视频| 视频一区欧美精品| 8x福利精品第一导航| 天堂蜜桃91精品| 欧美日韩成人激情| 日日骚欧美日韩| 中文字幕一区二区三中文字幕| 韩日欧美一区二区三区| 亚洲精品在线一区二区| 国产一区二区精品久久| 久久久久久久久久久久久夜| 国产精品88av| 国产精品女主播av| www.亚洲国产| 亚洲一区免费观看| 欧美日韩国产大片| 日本午夜精品视频在线观看| 日韩精品专区在线影院重磅| 国产一区中文字幕| 国产精品久久久久久久久快鸭| av成人免费在线观看| 亚洲综合另类小说| 欧美电影一区二区| 国产麻豆日韩欧美久久| 国产精品美女久久久久aⅴ | 中文字幕 久热精品 视频在线| 国产精品一区二区91| 中文av一区二区| 在线免费观看日本一区| 美女任你摸久久| 欧美激情在线看| 91国偷自产一区二区开放时间| 午夜视频一区二区三区| 欧美精品一区二区三区在线| 成人黄色av电影| 亚洲成a人片在线观看中文| 精品国产一区二区三区不卡 | 中文字幕在线观看一区二区| 91久久国产最好的精华液| 免费高清在线视频一区·| 亚洲国产激情av| 欧美视频第二页| 国产精品一二三在| 亚洲午夜精品一区二区三区他趣| 日韩欧美精品在线视频| 成人高清免费观看| 偷拍亚洲欧洲综合| 日本一区二区三级电影在线观看 | 精品国产伦一区二区三区观看方式 | 99re免费视频精品全部| 日韩国产成人精品| 国产精品免费免费| 日韩视频在线你懂得| 99久久久无码国产精品| 精品亚洲porn| 午夜精品视频一区| 亚洲欧美日韩电影| 久久蜜桃av一区精品变态类天堂| 欧美午夜电影网| 不卡的看片网站| 国产在线国偷精品免费看| 亚洲一区二区三区三| 国产女人水真多18毛片18精品视频| 欧美日韩1区2区| 91久久精品一区二区| 不卡电影一区二区三区| 国产精品亚洲一区二区三区妖精| 日韩精品三区四区| 亚洲国产三级在线| 一区二区三区.www| 亚洲精品视频一区二区| 国产精品国模大尺度视频| 久久久久久99精品| 久久综合五月天婷婷伊人| 日韩欧美一区二区三区在线| 欧美亚洲自拍偷拍| 在线这里只有精品| 在线免费亚洲电影| 色综合网色综合| 91色视频在线| 色综合色综合色综合色综合色综合 | 欧美日韩mp4| 91丨九色丨蝌蚪丨老版| av一区二区三区四区| 国产成人在线观看免费网站| 国产一区二区不卡| 国产精品99久久久久久似苏梦涵 | 欧美日本免费一区二区三区| 91麻豆国产福利精品| 成人av在线资源| 91网站最新地址| 欧美亚洲日本一区| 欧美精品777| 日韩一二三四区| 久久久精品免费网站| 国产精品家庭影院| 亚洲免费在线观看| 天堂久久久久va久久久久| 免费看日韩a级影片| 国产在线视视频有精品| 福利电影一区二区| 色婷婷综合五月| 欧美天堂亚洲电影院在线播放| 欧美日韩精品福利| 亚洲综合一区二区精品导航| 亚洲视频在线一区二区| 亚洲一区二区黄色| 日韩av一区二区三区| 麻豆成人在线观看| 国产999精品久久久久久绿帽| 91丨porny丨蝌蚪视频| 4438成人网| 欧美国产精品中文字幕|