享元模式

定义

享元模式是一种结构型模式,它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件

池技术的重要实现方式, 运用共享技术有效的支持大量的细粒度对象,用于减少创建对象的数量,以减少内存占用和提高性能。

使用场景

  • 在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。

  • 系统有大量相似对象。

  • 需要缓冲池的场景

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
/**
* Created by PhpStorm.
* User: Livfer
* Desc:
* Date: 2019/9/18
* Time: 16:14
*/

/**
* 抽象享元对象
* Class Flyweight
*/
abstract class Flyweight
{
protected $address;

public function __construct($address)
{
$this->address = $address;
}

abstract public function register();
}

class ConcreteFlyweight extends Flyweight
{
public function register()
{
echo "报考点是: ".$this->address.PHP_EOL;
}
}

/**
* 享元工厂类
* Class FlyweightFactory
*/
class FlyweightFactory
{
static protected $students = [];

/**
* @param $address
* @return Flyweight
*/
public static function getStudent($address)
{
$students = self::$students;
if (isset($students[$address])){
echo "缓存池中存在此考点的实例对象,直接返回".PHP_EOL;
}else{
echo "缓冲池没有,创建了考点为{$address}的对象并放到池中".PHP_EOL;
self::$students[$address] = new ConcreteFlyweight($address);
}

return self::$students[$address];
}
}

$studentOne = FlyweightFactory::getStudent('南京');
$studentOne->register();

$studentTwo = FlyweightFactory::getStudent('广州');
$studentTwo->register();

$studentThree = FlyweightFactory::getStudent('南京');
$studentThree->register();

参考

[设计模式详解以及PHP实现][http://yansu.org/2014/04/19/design-patterns-of-php.html]