亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

php示例詳解Constructor Prototype Pattern 原型模式

2024-05-04 23:39:36
字體:
來源:轉載
供稿:網友

原型模式是一種創建者模式,其特點在于通過“復制”一個已經存在的實例來返回新的實例,而不是新建實例。

原型模式中主要角色

抽象原型(Prototype)角色:聲明一個克隆自己的接口

具體原型(Concrete Prototype)角色:實現一個克隆自己的操作

當一個類大部分都是相同的只有部分是不同的時候,如果需要大量這個類的對象,每次都重復實例化那些相同的部分是開銷很大的,而如果clone之前建立對象的那些相同的部分,就可以節約開銷。

針對php的一種實現方式就是__construct()和initialize函數分開分別處理這個類的初始化,construct里面放prototype也就是公共的部分,initialize里面是每個對象特殊的部分。這樣我們先建立一個類不initialize,以后每次clone這個類再進行initialize就可以了。

在zend framework官方手冊里面提到了這個http://framework.zend.com/manual/2.0/en/user-guide/database-and-models.html,但是沒有細講,下面我來分析一下

一、引入

在zf2的model里面有一個albumTable類,相當于一個操作數據庫動作的助手類,里面用到了tablegateway。

為了每次初始化albumtable都是相同的一個類,將初始化工作放到了根目錄的module.php文件的getServiceConfig(),其中用到工廠模式,并且通過回調函數,當每次ServiceManager($sm)需要實例化一個對象的時候會自動調用創建一個alumTable。下面代碼我們可以看出,創建一個albumTable還需要用相同的方式創建一個AlbumTableGateWay,這個類就用到了我們所要講的原型模式。

二、代碼詳解

 

 
  1. public function getServiceConfig() 
  2. return array( 
  3. 'factories' => array( 
  4. 'Album/Model/AlbumTable' => function($sm) { 
  5. $tableGateway = $sm->get('AlbumTableGateway'); 
  6. $table = new AlbumTable($tableGateway); 
  7. return $table; 
  8. }, 
  9. 'AlbumTableGateway' => function ($sm) { 
  10. $dbAdapter = $sm->get('Zend/Db/Adapter/Adapter'); 
  11. $resultSetPrototype = new ResultSet(); 
  12. $resultSetPrototype->setArrayObjectPrototype(new Album());//這個就是一個不變的原型 
  13. return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);//傳入到TableGateWay的構造函數中去 
  14. }, 
  15. ), 
  16. ); 

注意并不是TableGateWay運用了原型模式而是ResultSet這個類運用了。每當tablegateway調用select()或者insert()等方法的時候都會建立一個ResultSet用來表示結果,這些ResultSet中公共部分被clone,而獨特的部分類如data就會被initialize。

三、更多代碼示例

為了更清晰得了解這個原型,我們先拋開zend這個大框架,看一個完整的代碼示例。示例來自

PHPConstructor Best Practices And The Prototype Pattern

這篇文章關于prototype pattern的部分前半部分其實是混雜怎樣在構造函數中運用繼承來提高擴展性,兩個模式看起來可能不太好理解,我們直接看最后的代碼關于prototype pattern的部分。

 

 
  1. <?php 
  2. //框架中很常見的adapter類,用來適配各種數據庫,封裝一些基本數據庫連接操作。 
  3. //相當于上面代碼中的adapter類 
  4. class DbAdapter { 
  5. public function fetchAllFromTable($table) { 
  6. return $arrayOfData; 
  7. //運用prototype pattern的類,注意construct和initialize是分開的 
  8. //相當于上面zend 代碼里面的ResultSet類 
  9. class RowGateway { 
  10. public function __construct(DbAdapter $dbAdapter, $tableName) { 
  11. $this->dbAdapter = $dbAdapter; 
  12. $this->tableName = $tableName; 
  13. public function initialize($data) { 
  14. $this->data = $data; 
  15. /** 
  16. * Both methods require access to the database adapter 
  17. * to fulfill their duties 
  18. */ 
  19. public function save() {} 
  20. public function delete() {} 
  21. public function refresh() {} 
  22. //相當于上面代碼中的TableGateway類,關于gateway可以具體去了解一下。 
  23. class UserRepository { 
  24. public function __construct(DbAdapter $dbAdapter, RowGateway $rowGatewayPrototype = null) { 
  25. $this->dbAdapter = $dbAdapter; 
  26. $this->rowGatewayPrototype = ($rowGatewayPrototype) ? new RowGateway($this->dbAdapter, 'user'
  27. public function getUsers() { 
  28. $rows = array(); 
  29. foreach ($this->dbAdapter->fetchAllFromTable('user') as $rowData) { 
  30. $rows[] = $row = clone $this->rowGatewayPrototype; 
  31. $row->initialize($rowData); 
  32. return $rows; 

這幾個類其實和上面zend代碼中的類是對應的

Dbadapter -- adpater

RowGateWay -- ResultSet

UserRepository - TableGateWay

具體看代碼中的注釋。

這里的RowGateWay可以很明顯的看出在getusers中需要大量的實例化,那么原型模式就是很必要的了。

下面是運用這個類的代碼

 

 
  1. class ReadWriteRowGateway extends RowGateway { 
  2. public function __construct(DbAdapter $readDbAdapter, DbAdapter $writeDbAdapter, $tableName) { 
  3. $this->readDbAdapter = $readDbAdapter; 
  4. parent::__construct($writeDbAdapter, $tableName); 
  5. public function refresh() { 
  6. // utilize $this->readDbAdapter instead of $this->dbAdapter in RowGateway base implementation 
  7. // usage: 
  8. $userRepository = new UserRepository( 
  9. $dbAdapter, 
  10. new ReadWriteRowGateway($readDbAdapter, $writeDbAdapter, 'user'
  11. ); 
  12. $users = $userRepository->getUsers(); 
  13. $user = $users[0]; // instance of ReadWriteRowGateway with a specific row of data from the db 

以上內容是小編給大家介紹的php示例詳解Constructor Prototype Pattern 原型模式,希望大家喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线精品视频视频中文字幕| 国产成人精品一区二区| 成人激情电影一区二区| 亚洲女人初尝黑人巨大| 久久久久久久久爱| 午夜精品一区二区三区av| 最新的欧美黄色| 日韩亚洲欧美成人| 亚洲免费小视频| 中日韩美女免费视频网站在线观看| 欧美做受高潮电影o| 国产精品免费一区豆花| 亚洲欧洲在线免费| 亚洲国产精品一区二区久| 欧美日韩精品二区| 51色欧美片视频在线观看| 欧美一级淫片播放口| 成人写真视频福利网| 国产色视频一区| 亚洲美女动态图120秒| 国产亚洲欧洲在线| 中文字幕av一区| 日韩大陆欧美高清视频区| 国产xxx69麻豆国语对白| 一个人看的www欧美| 精品久久中文字幕久久av| 国产精品久久久久999| 欧美在线观看视频| 国产在线精品播放| 国内精品模特av私拍在线观看| 久久韩剧网电视剧| 这里精品视频免费| 久久久久国产精品一区| 色琪琪综合男人的天堂aⅴ视频| 98精品在线视频| 日韩激情第一页| 国产精品igao视频| 日韩网站免费观看高清| 亚洲国产精品久久| 色婷婷av一区二区三区在线观看| 一个人看的www欧美| 日韩高清电影免费观看完整| 日韩av影片在线观看| 精品毛片三在线观看| 国产精品色婷婷视频| 97国产suv精品一区二区62| 日韩精品在线看| 欧洲成人午夜免费大片| 欧美日韩精品在线播放| 国产美女直播视频一区| 亚洲人成电影在线观看天堂色| 欧美精品久久一区二区| 北条麻妃99精品青青久久| 色哟哟入口国产精品| 狠狠色狠色综合曰曰| 日韩美女福利视频| 精品久久在线播放| 国模精品视频一区二区| 欧美激情网站在线观看| 91亚洲精品视频| 亚洲a∨日韩av高清在线观看| 国产精品激情av在线播放| 亚洲黄色av网站| 亚洲自拍另类欧美丝袜| 韩国国内大量揄拍精品视频| 国产网站欧美日韩免费精品在线观看| 欧美成人午夜剧场免费观看| 亚洲精品之草原avav久久| 久久精品亚洲94久久精品| 久久亚洲欧美日韩精品专区| 欧美成人精品在线播放| 国产成人97精品免费看片| 国产成人精品日本亚洲专区61| 日韩国产欧美精品一区二区三区| 美女视频黄免费的亚洲男人天堂| 国产欧美日韩视频| 欧美夫妻性生活xx| 欧美亚洲另类制服自拍| 国产一区av在线| 国产在线视频2019最新视频| 国产精品久久一区主播| 日韩精品视频免费| 久久久噜噜噜久久中文字免| 亚洲免费高清视频| 欧美日韩亚洲国产一区| 欧美裸体xxxx极品少妇| 美女视频黄免费的亚洲男人天堂| 91免费综合在线| 欧美午夜影院在线视频| 国产精品久久久久久久久久免费| 亚洲天堂第一页| 日韩国产高清污视频在线观看| 久久五月天色综合| 国产精品一二区| 亚洲最大成人在线| 永久免费毛片在线播放不卡| 91久久久久久久久| 欧美猛交免费看| 亚洲男女自偷自拍图片另类| 久久天堂电影网| 久久久久国色av免费观看性色| 茄子视频成人在线| 国产婷婷色综合av蜜臀av| 1769国内精品视频在线播放| 伊人久久久久久久久久久久久| 一区二区三区 在线观看视| 韩国精品美女www爽爽爽视频| 91久久精品国产91性色| 久久成人免费视频| 美女性感视频久久久| 色综合老司机第九色激情| 久久人人爽人人爽人人片av高请| 97精品伊人久久久大香线蕉| 91爱爱小视频k| 日韩成人在线视频网站| 欧美专区福利在线| 视频在线观看一区二区| 国产精品丝袜一区二区三区| 欧美日韩高清在线观看| 色综合伊人色综合网| 国产一区红桃视频| 亚洲第一区在线| 日韩精品欧美激情| 亚洲精品欧美日韩专区| 欧美性xxxx极品高清hd直播| 成人免费看黄网站| 国产精品高潮呻吟视频| 亚洲一区二区三区四区在线播放| 国产成人精品日本亚洲专区61| 久久99精品国产99久久6尤物| 亚洲美女性生活视频| 国产精品精品一区二区三区午夜版| 亚洲综合一区二区不卡| 成人网址在线观看| 久久久久免费视频| 亚洲欧美日韩国产中文专区| 91超碰caoporn97人人| 欧亚精品中文字幕| 国产精品久久久久久久久久免费| 国产精品久久久久久久久久久久久久| 国产精品视频男人的天堂| 亚洲欧美福利视频| 国产成人在线播放| 欧美激情女人20p| 国产成人精品免高潮在线观看| 91精品久久久久| 中文字幕在线观看亚洲| 亚洲国产精品yw在线观看| 国产精品99久久久久久www| 国产成人精品在线观看| 国产啪精品视频| 97在线观看免费| 中文字幕精品www乱入免费视频| 国产日韩换脸av一区在线观看| 国产精品久久久久久久久久久不卡| 国产福利视频一区| 91av视频导航| 国产精品丝袜白浆摸在线| 欧美麻豆久久久久久中文| 欧美黑人一区二区三区| 日韩av电影手机在线观看| 色偷偷偷综合中文字幕;dd| 日韩高清有码在线| 国内精品在线一区|