享元模式很好的实例

<?php
/**
 * 享元模式
 *
 * 运用享元技术有效的支持大量细粒度的对象
 */
class CD
{
    private $_title = null;
    private $_artist = null;
    public function setTitle($title)
    {
        $this->_title = $title;
    }
    public function getTitle()
    {
        return $this->_title;
    }
    public function setArtist($artist)
    {
        $this->_artist = $artist;
        echo '打印参数传来的实例:'.serialize($artist).'<br>';
    }
    public function getArtist($artist)
    {
        return $this->_artist;
    }
}

class Artist
{
    private $_name;
    public function __construct($name)
    {
        echo "正在实例化:".$name."<br/>";
        $this->_name = $name;
    }
    public function getName()
    {
        return $this->_name;
    }
}

class ArtistFactory
{
    private $_artists = array();
    public function getArtist($name)
    {
        if(isset($this->_artists[$name]))//传过来的参数已经被实例化了,就返回参数对应的实例
        {
            return $this->_artists[$name];
        }
        else
        {
            $objArtist = new Artist($name);//实例化一个对象
            $this->_artists[$name] = $objArtist;//这个主要记录传过来的参数已经被实例化
            return $objArtist;//返回实例
        }
    }
}

//这里享元模式的研究对象是Artist类
$objArtistFactory = new ArtistFactory();
$objCD1 = new CD();
$objCD1->setTitle("title1");
$objCD1->setArtist($objArtistFactory->getArtist('artist1'));
$objCD2 = new CD();
$objCD2->setTitle("title2");
$objCD2->setArtist($objArtistFactory->getArtist('artist2'));
$objCD3 = new CD();
$objCD3->setTitle("title3");
$objCD3->setArtist($objArtistFactory->getArtist('artist1'));//这个artist1对象已经存在,所以“正在实例化”那句不会输出

 

 

 

转载于:https://www.cnblogs.com/jiufen/p/5000554.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值