20-享元模式
目录
代码示例
<?php
/**
* Description of FlyWeightDemo
* 享元模式
* @author jm
*/
class FlyWeightDemo
{
//put your code here
public static function main()
{
$channel = (new ChannelFactory())->getChannel("huawei");
$channel->set(new User("JM"));
$channel = (new ChannelFactory())->getChannel("apple");
$channel->set(new User("JM"));
$channel = (new ChannelFactory())->getChannel("huawei");
$channel->set(new User("Tsing"));
$channel = (new ChannelFactory())->getChannel("apple");
$channel->set(new User("Chan"));
}
}
class User
{
private $_name;
function __construct($name)
{
$this->_name = $name;
}
public function getName()
{
return $this->_name;
}
}
interface IChannel{
public function set($user);
}
class Channel implements IChannel{
private $_name = '';
public function __construct($name)
{
$this->_name = $name;
}
public function set($user){
echo "渠道:".$this->_name."用户:".$user->getName()."\n";
}
}
class ChannelFactory{
private $_channels = [];
public function getChannel($key)
{
if (empty($this->_channels[$key])) {
$this->_channels[$key] = new Channel($key);
}
return $this->_channels[$key];
}
public function getChannelCount()
{
return count($this->_channels);
}
}
FlyWeightDemo::main();
输出
渠道:huawei用户:JM
渠道:apple用户:JM
渠道:huawei用户:Tsing
渠道:apple用户:Chan
渠道总数:2
小结
ChannelFactory负责创建和管理享元单元Channel,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象。
一提到共享池,我们很容易联想到Java里面的JDBC连接池,想想每个连接的特点,我们不难总结出:适用于作共享的一些个对象,他们有一些共有的属性,就拿数据库连接池来说,url、driverClassName、username、password及dbname,这些属性对于每个连接来说都是一样的,所以就适合用享元模式来处理,建一个工厂类,将上述类似属性作为内部数据,其它的作为外部数据,在方法调用时,当做参数传进来,这样就节省了空间,减少了实例的数量。
本文部分收藏来自互联网,仅用于学习研究,著作权归原作者所有,如有侵权请联系删除
markdown 9ong@TsingChan