天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

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

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

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

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

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

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

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

復(fù)制代碼 代碼如下:
<?php
/**
* 享元模式
*
* 運(yùn)用享元技術(shù)有效的支持大量細(xì)粒度的對象
*/
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):

  1. 被系統(tǒng)大量使用的細(xì)粒度對象,粒度要有多細(xì),量要有多大,看看jdk中使用的享元模式就知道了,jdk中,Integer,Character,String等都使用了享元模式,他們都是最基礎(chǔ)的數(shù)據(jù)類型,不可謂不細(xì),他們頻繁的參與運(yùn)算,不可謂不大量。
  2. 劃分對象的內(nèi)蘊(yùn)屬性/狀態(tài)和外蘊(yùn)屬性/狀態(tài);所謂內(nèi)蘊(yùn)狀態(tài),就是存在對象的內(nèi)部,不會隨著環(huán)境變化的狀態(tài), 有一個網(wǎng)友說的很好,就是無區(qū)別的狀態(tài), 即拿掉外蘊(yùn)屬性之后同一類對象沒有區(qū)別對象的內(nèi)蘊(yùn)狀態(tài)就是對象的元神,只要元神元神無區(qū)別,那么對象也就無區(qū)別,同時也只有這些無區(qū)別的元神可以被共享,我想這也是Flyweight被翻譯成享元的原因。外蘊(yùn)狀態(tài)就是由客戶端指定,會隨著環(huán)境變化的狀態(tài); 對于Integer來說, 他的內(nèi)蘊(yùn)屬性其實(shí)就是他的value(當(dāng)然它也沒有外蘊(yùn)屬性);
  3. 用一個工廠控制享元的創(chuàng)造;因?yàn)橄碓獙ο蟛荒鼙豢蛻舳穗S意創(chuàng)造, 否則就沒有意義了。工廠通常提供緩存機(jī)制保存已經(jīng)創(chuàng)造的享元。

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

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

php技術(shù)php設(shè)計(jì)模式 FlyWeight (享元模式),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产一区亚洲 | 日韩一区精品视频一区二区 | 九九夜夜妹子 | 午夜亚洲WWW湿好大 午夜性爽视频男人的天堂在线 | 国产午夜亚洲精品一区 | 秘密教学93话恩爱久等了免费 | 成人性生交大片免费看金瓶七仙女 | 国产51麻豆二区精品AV视频 | 综合激情区视频一区视频二区 | 脱女学小内内摸出水网站免费 | 色婷婷AV99XX| 伊人影院中文字幕 | 伊人国产在线视频 | 国产人妻人伦精品久久久 | 精品无码一区二区三区中文字幕 | 久久国产36精品色熟妇 | 嗯呐啊唔高H兽交 | 国产精品免费观看视频 | 色综合伊人色综合网站中国 | 亚洲 自拍 清纯 综合图区 | www.青青草原 | 寻找最美乡村教师颁奖晚会 | 成人伦理影院 | 红尘影院在线观看 | 国产精品三级在线观看 | 农民工老头在出租屋嫖老熟女 | 强被迫伦姧惨叫VIDEO | 亚洲精品卡2卡3卡4卡5卡区 | 色噜噜噜视频 | 亚洲三级视频 | 国产人妻麻豆蜜桃色 | 看全色黄大色大片免费久黄久 | 最近的2019中文字幕国语完整版 | 亚洲国产精品线在线观看 | 粉嫩AV国产一区二区福利姬 | 亚洲国产精品无码中文字幕 | 精品96在线观看影院 | 成年AV动漫 | 亚洲精品无码久久久久A片空 | 青青青久草 | 韩国精品韩国专区久久 |