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();
}

设计模式之享元模式(PHP实现)的更多相关文章

  1. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  2. python设计模式之享元模式

    python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...

  3. 【GOF23设计模式】享元模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_享元模式.享元池.内部状态.外部状态.线程池.连接池 package com.test.flyweight; /** * ...

  4. 设计模式之享元模式(Flyweight)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  5. Head First设计模式之享元模式(蝇量模式)

    一.定义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. ...

  6. 【Unity3D与23种设计模式】享元模式(Flyweight)

    GoF中定义: "使用共享的方式,让一大群小规模对象能更有效地运行" 享元模式一般应用在游戏角色属性设置上 游戏策划需要通过"公式计算"或者"实际测试 ...

  7. Java进阶篇设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  8. Java设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  9. 【设计模式】享元模式(Flyweight)

    摘要: 1.本文将详细介绍享元模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入享元模式 2. 享元模式的概念及优缺点介绍 3. 享元模式在Android源码中的应用 1 ...

随机推荐

  1. DOM对象转化成jQuery对象

    相比较jQuery转化成DOM,开发中更多的情况是把一个DOM对象加工成jQuery对象.$(参数)是一个多功能的方法,通过传递不同的参数而产生不同的作用. 如果传递给$(DOM)函数的参数是一个DO ...

  2. MIFARE Classic S50技术详解

    Mifare Classic 简介 MIFARE Classic是恩智浦半导体开发的可用于非接触式智能卡,符合ISO/IEC 14443 A类标准.用于公共交通票证等应用,还可用于各类其他应用有S20 ...

  3. 点对点协议(Point-to-Point Protocol)

    简介 点对点协议简称PPP协议,工作在数据链路层.设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机. 网桥和路由器之间简单连接的一种共通的解决方案. PPP协议的组成 建立 ...

  4. 7月13号day5总结

    今天学习过程和小结 使用伪分布式进行大数据计算,计算气象站记录气温的平均值 weather map()方法,key值数据多所以用LongWritable,value值是string类型,string类 ...

  5. 图表绘制工具--Matplotlib 3

    ''' [课程3.] 表格样式创建 表格视觉样式:Dataframe.style → 返回pandas.Styler对象的属性,具有格式化和显示Dataframe的有用方法 样式创建: ① Style ...

  6. angular组件--tips提示功能

    将组件封装起来在项目中开发很实用,之前遭遇过一次痛苦的经历,那阵子改的要吐血了.常用的组件封装起来,改公共的地方,往往多处受用. 例如:我在项目中引用  tips.text('加载中...',fals ...

  7. 道路修建(bzoj 2435)

    Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. ...

  8. .ini配置CAN信息

    #include <iostream> #include <windows.h>//这个头文件一定要添加,否则GetPrivateProfileString(...)函数无法使 ...

  9. 经典linux书籍

    入门篇<LINUX权威指南>书不错,写的很全面也比较广,涉及的不深,做为入门书籍不错,可以比较全面的了解linux .另外比较热门的也可以看看<鸟哥的私房菜>等书,偏管理类的书 ...

  10. Spring Cloud配置文件加载优先级简述

    Spring Cloud中配置文件的加载机制与其它的Spring Boot应用存在不一样的地方:如它引入了bootstrap.properties的配置文件,同时也支持从配置中心中加载配置文件等:本文 ...