激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - PHP設計模式之原型模式示例詳解

PHP設計模式之原型模式示例詳解

2021-11-04 14:30ZyBlog PHP教程

這篇文章主要給大家介紹了關于PHP設計模式之原型模式的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

原型模式其實更形象的來說應該叫克隆模式。它主要的行為是對對象進行克隆,但是又把被克隆的對象稱之為最初的原型,于是,這個模式就這樣被命名了。說真的,從使用方式來看真的感覺叫克隆模式更貼切一些。

Gof類圖及解釋

GoF定義:用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象

GoF類圖

PHP設計模式之原型模式示例詳解

代碼實現

?
1
2
3
4
5
6
7
8
9
10
11
abstract class Prototype
{
 public $v = 'clone' . PHP_EOL;
 
 public function __construct()
 {
  echo 'create' . PHP_EOL;
 }
 
 abstract public function __clone();
}

首先我們通過模擬的方式定義了一個原型,這里主要是模擬了__clone()這個方法。其實這是PHP自帶的一個魔術方法,根本是不需要我們去進行定義的,只需要在原型類中進行實現就可以了。當外部使用clone關鍵字進行對象克隆時,直接就會進入這個魔術方法中。在這個魔術方法里面我們可以對屬性進行處理,特別是針對引用屬性進行一些獨特的處理。在這個例子中,我們只使用了一個值類型的變量。無法體現出引用類型的問題,我們將在后面的實例中演示對引用類型變量的處理。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
class ConcretePrototype1 extends Prototype
{
 public function __clone()
 {
 }
}
 
class ConcretePrototype2 extends Prototype
{
 public function __clone()
 {
 }
}

模擬的具體實現的原型,其實就是主要去具體的實現__clone()方法。后面我們看具體的例子時再說明。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Client
{
 public function operation()
 {
  $p1 = new ConcretePrototype1();
  $p2 = clone $p1;
 
  echo $p1->v;
  echo $p2->v;
 }
}
 
$c = new Client();
$c->operation();

客戶端使用clone來復制P1 可以看到p2也具有相同的$v屬性。

  • 原型模式看似就是復制了一個相同的對象,但是請注意,復制的時候,__construct()方法并沒有被調用,也就是當你運行這段代碼的時候,create只輸出了一次。這也就帶出了原型模式最大的一個特點——減少創建對象時的開銷。
  • 基于上述特點,我們可以快速的復制大量相同的對象,比如要給一個數組中塞入大量相同的對象時。
  • 復制出來的對象中如果都是值類型的屬性,我們可以任意修改,不會對原型產生影響。而如果有引用類型的變量,則需要在__clone()方法進行一些處理,否則修改了復制對象的引用變量中的內容,會對原型對象中的內容有影響。

我們的手機操作系統(也可以想象一下PC電腦的操作系統),都是怎樣安裝到設備中呢?其實都是不停的復制拷貝最初的那一套系統。用微軟的例子非常好說明這個問題,當年微軟能夠成為一個帝國,其實也是因為他不停的將winodws操作系統拷貝復制到光盤中,然后賣給千家萬戶(當然,這里沒中國什么事兒)。而中國市場呢,大量的高手破解了windows之后也是由這一份文件不停的復制拷貝才裝到了我們的電腦中。手機、智能設備等各類產品的操作系統、軟件都是如此。一次開發無限拷貝正是軟件行業暴利的原因。畢竟我們的系統也是由不少的工程師日以繼夜的996在Android原生系統的基礎上開發出來的,趕緊不斷的復制到即將出廠的手機上吧!!

完整代碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/08.prototype/source/prototype.php

實例

同樣還是拿手機來說事兒,這次我們是根據不同的運營商需要去開發一批定制機,也就是套餐機。這批手機說實話都并沒有什么不同,大部分都是相同的配置,但是運營商系統不同,而且偶爾有一些型號的CPU和內存也可能存在不同。這個時候,我們就可以用原型模式來進行快速的復制并且只修改一部分不相同的地方啦。

原型模式生產手機類圖

PHP設計模式之原型模式示例詳解

完整源碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/08.prototype/source/prototype-phone.php

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
interface ServiceProvicer
{
 public function getSystem();
}
 
class ChinaMobile implements ServiceProvicer
{
 public $system;
 public function getSystem(){
  return "中國移動" . $this->system;
 }
}
class ChinaUnicom implements ServiceProvicer
{
 public $system;
 public function getSystem(){
  return "中國聯通" . $this->system;
 }
}
 
class Phone
{
 public $service_province;
 public $cpu;
 public $rom;
}
 
class CMPhone extends Phone
{
 function __clone()
 {
  // $this->service_province = new ChinaMobile();
 }
}
 
class CUPhone extends Phone
{
 function __clone()
 {
  $this->service_province = new ChinaUnicom();
 }
}
 
 
$cmPhone = new CMPhone();
$cmPhone->cpu = "1.4G";
$cmPhone->rom = "64G";
$cmPhone->service_province = new ChinaMobile();
$cmPhone->service_province->system = 'TD-CDMA';
$cmPhone1 = clone $cmPhone;
$cmPhone1->service_province->system = 'TD-CDMA1';
 
var_dump($cmPhone);
var_dump($cmPhone1);
echo $cmPhone->service_province->getSystem();
echo $cmPhone1->service_province->getSystem();
 
 
$cuPhone = new CUPhone();
$cuPhone->cpu = "1.4G";
$cuPhone->rom = "64G";
$cuPhone->service_province = new ChinaUnicom();
$cuPhone->service_province->system = 'WCDMA';
$cuPhone1 = clone $cuPhone;
$cuPhone1->rom = "128G";
$cuPhone1->service_province->system = 'WCDMA1';
 
var_dump($cuPhone);
var_dump($cuPhone1);
echo $cuPhone->service_province->getSystem();
echo $cuPhone1->service_province->getSystem();

說明

  • 打印了很多東西呀,不過主要的還是看看移動手機,也就是CMPhone中的__clone()方法,我們沒有重新去初始化一個新對象。這時,復制的圖片cmPhone中的是同一個對象。沒錯,這就是引用的復制問題。引用只是復制了引用的地址,他們指向的是同一個對象。當圖片cmPhone里面的service_province對象里面的屬性也跟著改變了。
  • 在CUPhone中,我們重新new了一個新的service_province對象。這次外面的圖片cuPhone中引用對象的值。
  • 原型模式中最主要的就是要注意上述兩點,而普通的值屬性會直接進行復制,不會產生這個問題。這里又牽涉出另外兩個概念:淺復制和深復制
  • 淺復制,是指被復制對象的所有變量都含有與原來對象相同的值,而所有的對其他對象的引用都仍然指向原來的對象
  • 深復制把引用對象的變量指向復制過的新對象,而不是原有的被引用的對象
  • 關于引用和值的問題,我們將在其他的文章中進行講解

下期看點

原型模式雖然平常用得不多,但是學習之后發現還真是挺有用的,特別是需要大量的重復對象時,可以大大節約新建對象的資源需求,以后還是需要多多練習早日應用在實際的業務場景中。下一個又會是誰呢?別急別急,先去下個館子,廚師、服務員、顧客,這三個要素就能組成一個神奇的模式:命令模式

總結

到此這篇關于PHP設計模式之原型模式的文章就介紹到這了,更多相關PHP原型模式內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://mp.weixin.qq.com/s/KO4TuT2t5Xh_3BG3UrfN1w

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 中国av中文字幕 | 最新日韩中文字幕 | 久久精品视频在线免费观看 | www亚洲免费 | 久久久久国产成人精品亚洲午夜 | 久久国产精品区 | 亚洲一区二区不卡视频 | 欧美精品免费一区二区三区 | 蜜桃视频观看麻豆 | 久久人人爽人人爽人人片av高请 | 久夜草| 91精品国啪老师啪 | 欧美特一级片 | 国产成人午夜精品 | 黄污网址| 亚洲特黄a级毛片在线播放 久久久入口 | 色人久久 | 亚洲精品7777xxxx青睐 | 午夜视频免费在线观看 | 91精品中文字幕 | 奇米影视奇米色777欧美 | 嗯~啊~弄嗯~啊h高潮视频 | 久久精热 | 久草干 | 爱逼爱操综合网 | 一级做a爱片久久 | 特大黑人videos与另类娇小 | 日韩蜜桃视频 | 一级黄色片武则天 | 久久影城 | 91网视频 | 欧美精品亚洲人成在线观看 | 九九热在线精品视频 | 欧美另类视频一区 | 亚洲极色 | 欧美成人免费一区二区三区 | 中国美女一级黄色片 | 国产1区视频| 91毛片网站 | 97人操| 久久久www视频 |