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