一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

服務器之家 - 編程語言 - PHP教程 - php設計模式 FlyWeight (享元模式)

php設計模式 FlyWeight (享元模式)

2019-12-01 12:38PHP教程網 PHP教程

運用享元技術有效的支持大量細粒度的對象,需要的朋友可以參考下。

享元模式英文稱為“Flyweight Pattern”,我非常感謝將Flyweight Pattern翻譯成享元模式的那位強人,因為這個詞將這個模式使用的方式明白得表示了出來;如果翻譯成為羽量級模式或者蠅量級模式等等,雖然可以含蓄的表現出使用此模式達到的目的,但是還是沒有抓住此模式的關鍵。 

享元模式的定義為:采用一個共享來避免大量擁有相同內容對象的開銷。這種開銷中最常見、直觀的就是內存的損耗。享元模式以共享的方式高效的支持大量的細粒度對象。 

在名字和定義中都體現出了共享這一個核心概念,那么怎么來實現共享呢?要知道每個事物都是不同的,但是又有一定的共性,如果只有完全相同的事物才能共享,那么享元模式可以說就是不可行的;因此我們應該盡量將事物的共性共享,而又保留它的個性。為了做到這點,享元模式中區分了內蘊狀態和外蘊狀態。內蘊狀態就是共性,外蘊狀態就是個性了。 

注:共享的對象必須是不可變的,不然一變則全變(如果有這種需求除外)。 

內蘊狀態存儲在享元內部,不會隨環境的改變而有所不同,是可以共享的;外蘊狀態是不可以共享的,它隨環境的改變而改變的,因此外蘊狀態是由客戶端來保持(因為環境的變化是由客戶端引起的)。在每個具體的環境下,客戶端將外蘊狀態傳遞給享元,從而創建不同的對象出來。 

先看看下面程序,大概了解下享元模式。 

復制代碼代碼如下:


<?php 
/** 
* 享元模式 

* 運用享元技術有效的支持大量細粒度的對象 
*/ 
class CD 

private $_title = null; 
private $_artist = null; 
public function setTitle($title) 

$this->_title = $title; 

public function getTitle() 

return $this->_title; 

public function setArtist($artist) 

$this->_artist = $artist; 

public function getArtist($artist) 

return $this->_artist; 


class Artist 

private $_name; 
public function __construct($name) 

echo "construct ".$name."<br/>"; 
$this->_name = $name; 

public function getName() 

return $this->_name; 


class ArtistFactory 

private $_artists = array(); 
public function getArtist($name) 

if(isset($this->_artists[$name])) 

return $this->_artists[$name]; 
} else { 
$objArtist = new Artist($name); 
$this->_artists[$name] = $objArtist; 
return $objArtist; 



$objArtistFactory = new ArtistFactory(); 
$objCD1 = new CD(); 
$objCD1->setTitle("title1"); 
$objCD1->setArtist($objArtistFactory->getArtist('artist1')); 
$objCD2 = new CD(); 
$objCD2->setTitle("title2"); 
$objCD2->setArtist($objArtistFactory->getArtist('artist2')); 
$objCD3 = new CD(); 
$objCD3->setTitle("title3"); 
$objCD3->setArtist($objArtistFactory->getArtist('artist1')); 

 

享元模式的精要有三點:

  • 被系統大量使用的細粒度對象,粒度要有多細,量要有多大,看看jdk中使用的享元模式就知道了,jdk中,Integer,Character,String等都使用了享元模式,他們都是最基礎的數據類型,不可謂不細,他們頻繁的參與運算,不可謂不大量。

  • 劃分對象的內蘊屬性/狀態和外蘊屬性/狀態;所謂內蘊狀態,就是存在對象的內部,不會隨著環境變化的狀態, 有一個網友說的很好,就是無區別的狀態, 即拿掉外蘊屬性之后同一類對象沒有區別對象的內蘊狀態就是對象的元神,只要元神元神無區別,那么對象也就無區別,同時也只有這些無區別的元神可以被共享,我想這也是Flyweight被翻譯成享元的原因。外蘊狀態就是由客戶端指定,會隨著環境變化的狀態; 對于Integer來說, 他的內蘊屬性其實就是他的value(當然它也沒有外蘊屬性);

  • 用一個工廠控制享元的創造;因為享元對象不能被客戶端隨意創造, 否則就沒有意義了。工廠通常提供緩存機制保存已經創造的享元。

面向對象雖然很好地解決了抽象性的問題,但是對于一個實際運行的軟件系統,我們還需要考慮面向對象的代價問題,享元模式解決的就是面向對象的代價問題。享元模式采用對象共享的做法來降低系統中對象的個數,從而降低細粒度對象給系統帶來的內存壓力。

享元模式在一般的項目開發中并不常用,而是常常應用于系統底層的開發,以便解決系統的性能問題。Java和.Net中的String類型就是使用了享元模式。如果在Java或者.NET中已經創建了一個字符串對象s1,那么下次再創建相同的字符串s2的時候,系統只是把s2的引用指向s1所引用的具體對象,這就實現了相同字符串在內存中的共享。如果每次執行s1=“abc”操作的時候,都創建一個新的字符串對象的話,那么內存的開銷會很大。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品欧美亚洲韩国日本 | 亚洲国产区男人本色在线观看欧美 | 国内在线播放 | 亚州精品永久观看视频 | 我被黑人彻底征服的全文 | 无人区在线观看免费国语完整版 | 国产79av| 4438全国最大免费观看 | 性猛交娇小69hd | 好大好硬好长好爽a网站 | 二次元美女扒开内裤露尿口 | 青青青手机在线视频 | 亚洲色图150p | 国内揄拍国内精品久久 | 国产白虎 | 日本无遮挡拍拍拍凤凰 | 亚洲精品无码不卡在线观看 | 女教师被学生糟蹋三天 | 日韩精品视频观看 | 国产欧美日韩一区二区三区在线 | 男人晚上看的 | 精品9e精品视频在线观看 | 日韩无砖2021特黄 | 美女被躁了在线观看视频 | 久久大胆视频 | 91赵邦贺| 国产拍拍拍免费专区在线观看 | 视频一区二区国产 | 日本 片 成人 在线 日b视频免费 | 欧美黑人性| 午夜欧美精品久久久久久久 | 99在线在线视频免费视频观看 | 国产午夜精品福利久久 | 校花被老头夺去第一次动图 | 国产乱叫456在线 | 俄罗斯三级在线观看级 | 亚洲色图图 | 视频一区 日韩 | 天天色踪合合 | 亚洲视频在线观看免费视频 | 奇米777狠狠 |