1. 程式人生 > >享元模式——滴滴打車的共享經濟思維

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

“共享經濟”想必大家都不陌生,出行服務的滴滴,租房服務的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');

顯示結果:
這裡寫圖片描述

總結
如果一個應用程式使用了大量的物件,而大量的物件會消耗大量的儲存,那麼就可以考慮使用享元模式。通過上面程式碼可以看出,我們刪除了物件的外部狀態(乘客物件),保留內部狀態,通過不同的外部狀態來區分不同的物件。