目录

代码示例

<?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 @TsingChan