享元模式——滴滴打車的共享經濟思維
阿新 • • 發佈:2019-02-13
“共享經濟”想必大家都不陌生,出行服務的滴滴,租房服務的Aribnb,甚至還有共享廁所的滴滴拉屎,在我們提供便利的同時也降低了資源的消耗,提高了資源的利用率。在設計模式中,享元模式也體現著這個新的網際網路思想——共享,同樣的,利用享元模式也可以達到降低計算機資源的損耗的目的。
下面我們以滴滴為例子來演示享元模式的用法。
在共享經濟口號尚未出現在中國網際網路之前,我們出門打計程車都是一人一車的,我們知道一輛普通的小轎車至少可以乘坐4人,當只坐一人的時候,顯然剩下的兩個位置的資源都被浪費了。同樣的,在系統中有時候我們需要例項化很多物件,但是這些物件卻有很大的相似性,只是一些資料的不同,這樣的話就相當於一人一車,造成了系統記憶體資源的浪費。
現在如果我們用共享經濟的思想來對這種情況進行改造,當需要使用一個物件的時候(當需要坐車的時候),返回一個共享的物件(這時是順風車),只是傳入物件中的方法的資料不同(乘車人不同)。是時候動手敲程式碼了~
單例工廠:
class singleFactory{
private static $object=array();
private function __construct(){
}
public static function getInstance($class){
if(!isset(self::$object[$class])||!self ::$object[$class] instanceof $class ){
self::$object[$class]=new $class();
}
return self::$object[$class];
}
}
滴滴排程中心(享元工廠)
class didiControlCenter{
//派出專車數目
public static $UnsharedCarCount=0;
//派出順風車數目
public static $sharedCarCount=0;
//座位數
public static $seat=0;
protected $sharedCarList=array();
protected $unsharedCarList=array();
//獲取共享的物件
public function getSharedCar(){
$number="粵A".rand(00000,99999);
if (0 == count($this->sharedCarList) || static::$seat==4){
$this->sharedCarList[]=new sharedCar($number);
static::$sharedCarCount++;
static::$seat=0;
}
static::$seat++;
return $this->sharedCarList[static::$sharedCarCount-1];
}
//獲取不共享的物件
public function getUnShareCar(){
$number="粵A".rand(00000,99999);
$this->unsharedCarList[]=new unsharedCar($number);
static::$UnsharedCarCount++;
return $this->unsharedCarList[self::$UnsharedCarCount-1];
}
}
出行業務基類
abstract class goOutBusiness{
public $number;
public function __construct($number)
{
$this->number=$number;
}
abstract function drive(passenger $passenger);
}
//順風車,享元
class sharedCar extends goOutBusiness {
function drive(passenger $passenger)
{
echo "{$passenger->name}乘坐車牌號為{$this->number}的車<br>";
}
}
//專車,非享元
class unsharedCar extends goOutBusiness {
function drive(passenger $passenger)
{
echo "{$passenger->name}乘坐車牌號為{$this->number}的車<br>";
}
}
依賴類,乘客類
class passenger{
public $name;
public $server;
public function __construct($name)
{
$this->name=$name;
$this->server=singleFactory::getInstance('didiControlCenter');
}
public function byCar($orderType){
$functionName="get".$orderType;
$business=$this->server->$functionName();
$business->drive($this);
}
}
客戶端程式碼:
//定義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');
顯示結果:
總結
如果一個應用程式使用了大量的物件,而大量的物件會消耗大量的儲存,那麼就可以考慮使用享元模式。通過上面程式碼可以看出,我們刪除了物件的外部狀態(乘客物件),保留內部狀態,通過不同的外部狀態來區分不同的物件。