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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - PHP教程 - php設(shè)計(jì)模式 FlyWeight (享元模式)

php設(shè)計(jì)模式 FlyWeight (享元模式)

2019-12-01 12:38PHP教程網(wǎng) PHP教程

運(yùn)用享元技術(shù)有效的支持大量細(xì)粒度的對(duì)象,需要的朋友可以參考下。

享元模式英文稱為“Flyweight Pattern”,我非常感謝將Flyweight Pattern翻譯成享元模式的那位強(qiáng)人,因?yàn)檫@個(gè)詞將這個(gè)模式使用的方式明白得表示了出來;如果翻譯成為羽量級(jí)模式或者蠅量級(jí)模式等等,雖然可以含蓄的表現(xiàn)出使用此模式達(dá)到的目的,但是還是沒有抓住此模式的關(guān)鍵。 

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

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

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

內(nèi)蘊(yùn)狀態(tài)存儲(chǔ)在享元內(nèi)部,不會(huì)隨環(huán)境的改變而有所不同,是可以共享的;外蘊(yùn)狀態(tài)是不可以共享的,它隨環(huán)境的改變而改變的,因此外蘊(yùn)狀態(tài)是由客戶端來保持(因?yàn)榄h(huán)境的變化是由客戶端引起的)。在每個(gè)具體的環(huán)境下,客戶端將外蘊(yùn)狀態(tài)傳遞給享元,從而創(chuàng)建不同的對(duì)象出來。 

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

復(fù)制代碼代碼如下:


<?php 
/** 
* 享元模式 

* 運(yùn)用享元技術(shù)有效的支持大量細(xì)粒度的對(duì)象 
*/ 
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')); 

 

享元模式的精要有三點(diǎn):

  • 被系統(tǒng)大量使用的細(xì)粒度對(duì)象,粒度要有多細(xì),量要有多大,看看jdk中使用的享元模式就知道了,jdk中,Integer,Character,String等都使用了享元模式,他們都是最基礎(chǔ)的數(shù)據(jù)類型,不可謂不細(xì),他們頻繁的參與運(yùn)算,不可謂不大量。

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

  • 用一個(gè)工廠控制享元的創(chuàng)造;因?yàn)橄碓獙?duì)象不能被客戶端隨意創(chuàng)造, 否則就沒有意義了。工廠通常提供緩存機(jī)制保存已經(jīng)創(chuàng)造的享元。

面向?qū)ο箅m然很好地解決了抽象性的問題,但是對(duì)于一個(gè)實(shí)際運(yùn)行的軟件系統(tǒng),我們還需要考慮面向?qū)ο蟮拇鷥r(jià)問題,享元模式解決的就是面向?qū)ο蟮拇鷥r(jià)問題。享元模式采用對(duì)象共享的做法來降低系統(tǒng)中對(duì)象的個(gè)數(shù),從而降低細(xì)粒度對(duì)象給系統(tǒng)帶來的內(nèi)存壓力。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 唯美 清纯 另类 亚洲制服 | 欧美人禽杂交在线视频 | 日韩毛片免费 | 日韩毛片高清在线看 | 日韩在线中文字幕 | 毛片在线看网站 | 亚洲精品6久久久久中文字幕 | 床戏小说| 操黄| 无人视频在线观看完整版高清 | blacked黑人 | 久久WWW免费人成一看片 | 狠狠久久久久综合网 | 亚洲成A人片在线观看中文L | 四虎影视4hu最新地址在线884 | 激情亚洲天堂 | 国产成人亚洲精品一区二区在线看 | 香蕉国产人午夜视频在线观看 | 毛片免费网站 | 欧美日韩一区二区三区在线观看 | www一区二区 | 欧美日韩国产一区二区三区欧 | 天天爽天天干天天操 | 日韩有码| 久久久久伊人 | 国产成人精品一区二区 | 不卡视频一区二区 | 四虎四虎| juliaann大战黑人 | 日产乱码卡1卡2卡三免费 | 紧身短裙女教师波多野 | 亚洲精品久久久久福利网站 | 欧美日韩亚洲第一区在线 | jj视频免费 | 天堂va在线 | 久久综合狠狠综合久久综合88 | 日本一级不卡一二三区免费 | 婷婷在线网站 | 激情文学综合网 | 日韩国产成人精品视频人 | 亚洲精品6久久久久中文字幕 |