享元模式 滴滴打車的共享經濟思維

2021-07-22 14:19:49 字數 2131 閱讀 7819

「共享經濟」想必大家都不陌生,出行服務的滴滴,租房服務的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欄...