github地址:https://github.com/ZQCard/design_pattern
/**
* 减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,
* 它提供了减少对象数量从而改善应用所需的对象结构的方式。
* 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
* 在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
* 优点:大大减少对象的创建,降低系统的内存,使效率提高。
* 缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。
* 使用场景: 1、系统有大量相似对象。 2、需要缓冲池的场景。
* 注意事项: 1、注意划分外部状态和内部状态,否则可能会引起线程安全问题。 2、这些类必须有一个工厂对象加以控制。
* 我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。
*/

(1)Shape.class.php(抽象接口)

<?php

namespace FlyWeight;

interface Shape
{
public function draw();
}

(2)Circle.class.php(具体实现类)

<?php

namespace FlyWeight;

class Circle implements Shape
{ private $color;
private $x;
private $y;
private $radius; public function __construct($color)
{
$this->color = $color;
} public function setX($x)
{
$this->x = $x;
} public function setY($y)
{
$this->y = $y;
} public function setRadius($radius)
{
$this->radius = $radius;
} public function draw()
{
print_r("Circle: Draw() [Color : " . $this->color .", x : " . $this->x .", y :" . $this->y .", radius :" . $this->radius);
echo '<br/>';
}
}

(3)ShapeFactory.class.php

<?php

namespace FlyWeight;

class ShapeFactory
{
private static $data = []; public static function getCircle($color)
{
$circle = null;
if (!isset(self::$data[$color])) {
$circle = new Circle($color);
self::$data[$color] = $circle;
print_r("Creating circle of color : " . $color);
}else{
$circle = self::$data[$color];
}
return $circle;
}
}

(4)fltWeight.class.php

<?php
spl_autoload_register(function ($className){
$className = str_replace('\\','/',$className);
include $className.".class.php";
}); use FlyWeight\ShapeFactory; $color = [ "Red", "Green", "Blue", "White", "Black" ]; for ($i = 0; $i < 20; $i ++) {
$circle = ShapeFactory::getCircle($color[array_rand($color)]);
$circle->setX(rand()*100);
$circle->setY(rand()*100);
$circle->setRadius(100);
$circle->draw();
}

最新文章

  1. loadrunner实现excel文件导出操作
  2. 写了一个自动打包并发布到tomcat的脚本
  3. 多个App间传递数据
  4. jQuery eislideshow 图片轮播
  5. 开源项目导入eclipse的一般步骤[转]
  6. MySQL开发中常用的查询语句总结
  7. php微信2 获取自定义菜单中的access_token
  8. media queries(练习)
  9. Windows查看进程taskList,终止进程tskill
  10. ecos的setting
  11. 二、初始化superset
  12. 强大的jupyter,python开发者的福音
  13. 一种表达式语言的解析引擎JEXL简单使用
  14. Alpha冲刺! Day4 - 磨刀
  15. vue打包速度优化
  16. fish shell 下gopath的设置问题
  17. 2018.07.08 NOIP模拟 ABCD(背包)
  18. 【PAT】1015 德才论 (25)(25 分)
  19. SQL错误代码弹出提示信息类
  20. 期末作品项目+ppt+设计文档,电子商城的实现,PC+IOS

热门文章

  1. PHP字符串基本操作函数
  2. SQL 唯一标识 写法
  3. javaScript构造函数、原型、面向对象编程
  4. POST JSON fails with 415 Unsupported media type, SpringMVC
  5. HDU 1153 magic bitstrings(读题+)
  6. 洛谷P3166 [CQOI2014]数三角形
  7. jsp的九大内置对象及EL表达式的隐含对象
  8. masscan banners 不显示
  9. Java设计模式_创建型模式_单例模式
  10. Kotlin来了