PHP设计模式-享元

适用性

  • php享元(轻量级)模式
  • 就是缓存了创建型模式创建的对象,不知道为什么会归在结构型模式中,个人觉得创建型模式更合适,哈哈~
  • 其次,享元强调的缓存对象,外观模式强调的对外保持简单易用,是不是就大体构成了目前牛逼哄哄且满大的街【依赖注入容器】
  • 下面我们借助最简单的’工厂模式‘来实现享元模式,就是给工厂加了个缓存池

UML

代码示例

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151

/**
* 农场
*
* 生产动物
*/
class Farm
{
/**
* 对象缓存池
* @var array
*/
private $_farmMap = [];

/**
* 构造函数
*/
public function __construct()
{
echo "-----------初始化了一个农场----------- \n\n";
}

/**
* 生产方法
*
* 生产农物
*
* @param string $type 农场类型
* @return mixed
*/
public function produce($type='')
{
// 对象缓存池判断
if (key_exists($type, $this->_farmMap)) {
echo "来自缓存池-> ";
return $this->_farmMap[$type];// 返回缓存
}

switch ($type) {
case 'chicken':
return $this->_farmMap[$type] = new Chicken();
break;

case 'pig':
return $this->_farmMap[$type] = new Pig();
break;

default:
echo "该农场不支持生产该农物~ \n";
break;
}
}
}

/**
* 动物接口
*/
interface AnimalInterface
{
/**
* 类型获取
*
* @return string
*/
public function getType();
}


/**
* 实体鸡
*
*/
class Chicken implements AnimalInterface
{
/**
* 类别
* @var string
*/
private $_type = '';

/**
* 构造函数
*/
public function __construct()
{

}

/**
* 类型获取
*
* @return string
*/
public function getType()
{
echo "这是只鸡~ \n";
}
}


/**
* 实体猪
*
*/
class Pig implements AnimalInterface
{
/**
* 类别
* @var string
*/
private $_type = '';

/**
* 构造函数
*/
public function __construct()
{

}

/**
* 类型获取
*
* @return string
*/
public function getType()
{
echo "这是只猪~ \n";
}
}


// 初始化一个工厂
$farm = new Farm();
//-----------初始化了一个农场-----------

// 成产一只鸡
$farm->produce('chicken')->getType();
//这是只鸡~

// 再生产一只鸡
$farm->produce('chicken')->getType();
//来自缓存池-> 这是只鸡~

// 成产一只猪
$farm->produce('pig')->getType();
//这是只猪~

// 再生产一只猪
$farm->produce('pig')->getType();
//来自缓存池-> 这是只猪~