「共享經濟」想必大家都不陌生,出行服務的滴滴,租房服務的aribnb,甚至還有共享廁所的滴滴拉屎,在我們提供便利的同時也降低了資源的消耗,提高了資源的利用率。在設計模式中,享元模式也體現著這個新的網際網路思想——共享,同樣的,利用享元模式也可以達到降低計算機資源的損耗的目的。
下面我們以滴滴為例子來演示享元模式的用法。
在共享經濟口號尚未出現在中國網際網路之前,我們出門打計程車都是一人一車的,我們知道一輛普通的小轎車至少可以乘坐4人,當只坐一人的時候,顯然剩下的兩個位置的資源都被浪費了。同樣的,在系統中有時候我們需要例項化很多物件,但是這些物件卻有很大的相似性,只是一些資料的不同,這樣的話就相當於一人一車,造成了系統記憶體資源的浪費。
現在如果我們用共享經濟的思想來對這種情況進行改造,當需要使用乙個物件的時候(當需要坐車的時候),返回乙個共享的物件(這時是順風車),只是傳入物件中的方法的資料不同(乘車人不同)。是時候動手敲**了~
單例工廠:
class
singlefactory
public
static
function
getinstance
($class)
return
self::$object[$class];
}}
滴滴排程中心(享元工廠)
class
didicontrolcenter
static::$seat++;
return
$this->sharedcarlist[static::$sharedcarcount-1];
}//獲取不共享的物件
public
function
getunsharecar
()}
出行業務基類
abstract
class
gooutbusiness
abstract
function
drive
(passenger $passenger);
}//順風車,享元
class
sharedcar
extends
gooutbusiness 乘坐車牌號為的車
"; }
}//專車,非享元
class
unsharedcar
extends
gooutbusiness 乘坐車牌號為的車
"; }
}
依賴類,乘客類
class
passenger
public
function
bycar
($ordertype)
}
客戶端**:
//定義7個乘客
$p1=
new passenger('小明');
$p2=
new passenger('小麗');
$p3=
new passenger('小偉');
$p4=
new passenger('小林');
$p5=
new passenger('小強');
$p6=
new passenger('小姐');
$p7=
new passenger('小老');
//五個坐順風車,4個坐專車,當順風車已滿,自動排程另一輛車
$p1->bycar('sharedcar');
$p2->bycar('sharedcar');
$p3->bycar('unsharecar');
$p4->bycar('unsharecar');
$p5->bycar('sharedcar');
$p6->bycar('sharedcar');
$p7->bycar('sharedcar');
總結
如果乙個應用程式使用了大量的物件,而大量的物件會消耗大量的儲存,那麼就可以考慮使用享元模式。通過上面**可以看出,我們刪除了物件的外部狀態(乘客物件),保留內部狀態,通過不同的外部狀態來區分不同的物件。
mysql 共享池 使用享元模式實現資源共享池
本節我們使用享元模式來實現資源共享池。舉個例子,每年春節為了買到一張回家的火車票,大家都大費周章。為了解決這一問題,12306 提供了自動查票的功能。如果開啟自動查票的功能,則系統會將我們填寫的資訊快取起來,然後定時查詢餘票資訊。在買票的時候,我們肯定要查詢一下有沒有我們需要的車票。假設一張火車票包...
23種設計模式之 12 享元模式(共享池)
練習原始碼 參考內容 簡說設計模式 享元模式 23種設計模式全解析 享元模式的主要目的是實現物件的共享,即共享池,當系統中物件多的時候可以減少記憶體的開銷,通常與工廠模式一起使用。flyweightfactory負責建立和管理享元單元,當乙個客戶端請求時,工廠需要檢查當前物件池中是否有符合條件的物件...
物件共享避免建立多物件享元模式 筆記
string類也有這種常量池技術!感覺類似工廠,用容器儲存要使用的物件,如果建立過就從容器中取 避免記憶體移除。message.obtain handler中的訊息池 儲存容器是單鏈表o message obtain return new message 每個message都有乙個同型別的next欄...