设计模式之享元模式(PHP实现)
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实现)的更多相关文章
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...
- python设计模式之享元模式
python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...
- 【GOF23设计模式】享元模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_享元模式.享元池.内部状态.外部状态.线程池.连接池 package com.test.flyweight; /** * ...
- 设计模式之享元模式(Flyweight)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- Head First设计模式之享元模式(蝇量模式)
一.定义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. ...
- 【Unity3D与23种设计模式】享元模式(Flyweight)
GoF中定义: "使用共享的方式,让一大群小规模对象能更有效地运行" 享元模式一般应用在游戏角色属性设置上 游戏策划需要通过"公式计算"或者"实际测试 ...
- Java进阶篇设计模式之七 ----- 享元模式和代理模式
前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...
- Java设计模式之七 ----- 享元模式和代理模式
前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...
- 【设计模式】享元模式(Flyweight)
摘要: 1.本文将详细介绍享元模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入享元模式 2. 享元模式的概念及优缺点介绍 3. 享元模式在Android源码中的应用 1 ...
随机推荐
- ocrosoft Contest1316 - 信奥编程之路~~~~~第三关问题 D: 手机话费
http://acm.ocrosoft.com/problem.php?cid=1316&pid=3 题目描述 小明的手机每天消费1元,每消费K元就可以获赠1元,一开始小明有M元,问最多可以用 ...
- 【Luogu】P4284概率充电器(概率树形DP)
题目链接 这题好神啊…… 设f[i]为i没电的概率,初始化$f[i]=1-q[i]$ 之后x的电有三个来源: 1.x自己有电 2.x的儿子给它传来了电 3.x的父亲给它传来了电 对于2和3操作分别做一 ...
- server reached pm.max_children setting (5), consider raising it
先查看日志 /data1/server/php-cgi/var/log/php-fpm.log[19-Dec-2012 11:41:13] WARNING: [pool www] server rea ...
- android 跨进程通信
转自:http://www.androidsdn.com/article/show/137 由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一 ...
- 转 Android_开源框架_AndroidUniversalImageLoader网络图片加载
转自:http://www.cnblogs.com/wanqieddy/p/3836485.html 1.功能概要 Android-Universal-Image-Loader是一个开源的UI组件程序 ...
- B-number(hdu 3652)
题意:找出1~n范围内含有13并且能被13整除的数字的个数 /* 数位DP dp[i][j][0]表示i位数模13为j当前没有包含13并且最高位不为1的方案数: dp[i][j][0]表示i位数模13 ...
- s19文件格式详解
1.概述 为了在不同的计算机平台之间传输程序代码和数据,摩托罗拉将程序和数据文件以一种可打印的格式(ASCII格式)编码成s格式文件.s格式文件是Freescale推荐使用的标准文件传送格式.编译完成 ...
- mysql 逻辑架构(三层)
1.客户端(主要处理连接,授权认证,安全等). 2.MYSQL服务器层(核心服务功能都在这层,包括,查询解析,分析,优化,缓存以及所有的内置函数,所有跨存储引擎的功能都在这层实现:存储过程,触发器,视 ...
- laravel 学习笔记 —— 神奇的服务容器
转载自:https://www.insp.top/learn-laravel-container 容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于 ...
- LVM更换硬盘
#检测坏道 smartctl -a /dev/sdd #硬盘检测 e2fsck -f /dev/mapper/vg_root-lv_data #重新定义空间大小,将原来的大小上减去要移走的硬盘 res ...