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

显示结果:

总结
如果一个应用程序使用了大量的对象,而大量的对象会消耗大量的存储,那么就可以考虑使用享元模式。通过上面代码可以看出,我们删除了对象的外部状态(乘客对象),保留内部状态,通过不同的外部状态来区分不同的对象。

享元模式——滴滴打车的共享经济思维相关推荐

  1. 享元模式(对象共享)

    享元模式 使用环境 示例 享元模式在Android中的应用 如果在某个场景需要很多重复的对象,你会每次都创建一个对象吗?显然重复的创建大量对象是一种很差的体验.这是享元模式就可以帮到我们了,使用享元模 ...

  2. 享元模式——对象共享,避免创建多对象

    1. 享元模式介绍 享元模式是对象池的一种实现,它的英文名称叫做Flyweight,代表轻量级的意思.享元模式用来尽可能减少内存使用量,他适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对 ...

  3. 13Flyweight(享元)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.Flyweight(享元)模式动机 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价--主要指 ...

  4. JAVA 设计模式 享元模式

    用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构 图-享元模式结构图 Flyweight : 它是所有具体享元类的超类或接口,通过这个 ...

  5. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  "享"取"共享"之意,"元"取"单元"之意. 意图 运用共享技术,有效的支持大量细粒度 ...

  6. 享元模式 -- 大话设计模式

    在今天,读书有时是件"麻烦"事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<大话设计模式>来祭奠那逝去的-- 享元模式:运用共享技术有效地支持大量细粒度的对 ...

  7. 设计模式(十五)享元模式(结构型)

    概述 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题.例如在一个文本字符串中存在很多重复的字符,如果每一个字符都用一个单独的对象来表示,将会占用较多的内存空间,那 ...

  8. 23种设计模式中的蝇量(享元)模式

    蝇量(享元)模式:通过共享的方式高效地支持大量细粒度的对象. 个人见解:实际上是在做大量for循环时,没必要将这些数据封装成一个对象,直接将对象的方法抽象出来,直接调用(静态),是一个优化的过程,,节 ...

  9. 享元模式(FlyWeight)

    享元模式使用场景: 内存属于稀缺资源,不要随便浪费.如果有很多个完全相同或相似的对象,我们可以用通过享元模式,节省内存. 享元模式的核心: 享元模式以共享的方式高效的支持大量细粒度对象的重用. 享元对 ...

  10. 结构型模式—享元模式

    原文作者:java_my_life 原文地址:<JAVA与模式>之享元模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述享元(Flyweight)模式的: Flyweig ...

最新文章

  1. 算法基础知识科普:8大搜索算法之AVL树(上)
  2. Php 获取xml中的节点值
  3. 一个新手对linux的认识
  4. 网络验证php接口逆向,一个专利查错的逆向(网络验证)
  5. 阿里数加大数据平台发布,将培养5万大数据科学家
  6. libpcap 编程入门资源
  7. Oracle小复习(1)
  8. 随想录(ionic开发app)
  9. 关于instanceof、isinstance和isAssignableFrom的区别
  10. 网络工程师的python之路pdf下载_网络工程师的Python之路:网络运维自动化实战
  11. Axure RP--快捷键大全(常用快捷键)
  12. Rimworld Mod教程 第六章:Defs文件
  13. 2020大学生就业报告:IT行业人才缺口巨大,好就业
  14. ue4 射线Trace Responses(踪迹响应)
  15. steam饥荒存档备份_如何手动备份您的Steam游戏文件
  16. Refined Architecture阶段
  17. AutoJs学习-读写手机联系人
  18. 华为鸿蒙几点开发布会,华为鸿蒙发布会6月2日直播几点开始?附直播观看入口...
  19. 2021年JavaScript最新手机号码、电话号码正则表达式
  20. vue.config.js中lintOnSave配置

热门文章

  1. IE下载文件无法弹出下载框
  2. websocket握手失败_WebSocket握手总结
  3. 【HDU5442】 Favorite Donut(后缀数组)
  4. 深度学习论文阅读图像分类篇(六):SENet《Squeeze-and-Excitation Networks》
  5. Ajax 入门Demo
  6. Ajax的readyState和status
  7. CryEngine ViewMat
  8. specular图使用方法_CSharpGL(54)用基于图像的光照(IBL)来计算PBR的Specular部分
  9. Spring XML 注入
  10. 暴雪战网重装失败问题解决