設計模式--對象池模式

今天咱們來介紹一下對象池模式,這種設計模式在平時的工做中使用頻率不像工廠模式那樣使用頻繁,可是它提供了一種新的對象使用和管理思想,仍是很值得借鑑的。設計模式

既然提到池了,那就是某一類或者一種事物的集合,好比線程池,這裏面會涉及到把對象放到池子和從池子裏面取對象的過程。this

那咱們先來定義一個Art類:線程

class Art
{
    private $_name;
    
    /**
     * @return mixed
     */
    public function getName()
    {
        return $this->_name;
    }
    
    /**
     * @param mixed $name
     */
    public function setName($name)
    {
        $this->_name = $name;
    }
}

咱們還須要定義一個對象池(ArtPool),來處理Art的入池和出池操做:設計

class ArtPool
{
    //藝術類列表
    static private $_arts = [];
    
    /**
     * 對象池中加入對象
     *
     * @param Art $art
     */
    static public function pushArt(Art $art)
    {
        if(!isset(static::$_arts[$art->getName()]) || empty(static::$_arts[$art->getName()]))
        {
            static::$_arts[$art->getName()] = $art;
        }
    }
    
    /**
     * 獲取對象
     *
     * @param $name
     * @return mixed|null
     */
    public static function getArt($name)
    {
        return isset(self::$_arts[$name]) ? self::$_arts[$name] : null;
    }
    
    /**
     * 從對象池中刪除對象
     *
     * @param $name
     */
    public static function removeArt($name)
    {
        if(array_key_exists($name, self::$_arts))
        {
            unset(self::$_arts[$name]);
        }
    }
}

這裏面有個比較重要的地方須要注意一下,就是:code

//藝術類列表
static private $_arts = [];

這個靜態變量來存儲全部的Art對象;對象

調用過程和執行結果:內存

class Client
{
    public static function main()
    {
        $music = new Art();
        
        $music->setName('music');
        
        //加入到對象池中
        ArtPool::pushArt($music);
    
        $movie = new Art();
        
        $movie->setName('movie');

        ArtPool::pushArt($movie);
    
        $music_in_pool = ArtPool::getArt('music');
        
        p('$music_in_pool',$music_in_pool);
        
        $movie_in_pool = ArtPool::getArt('movie');
        
        p('$movie_in_pool',$movie_in_pool);
    }
}

執行結果:rem

*******
$music_in_pool=
object(Art)#2 (1) {
  ["_name":"Art":private]=>
  string(5) "music"
}

*******
$movie_in_pool=
object(Art)#3 (1) {
  ["_name":"Art":private]=>
  string(5) "movie"
}

咱們根據不一樣的name來獲取不用的Art對象,這樣節省了new 時候的內存和操做時間,主要適用於頻繁建立對象和銷燬對象的場景。get

就像開始說,對象池模式相對比較簡單,可是給咱們提供了建立對象時一種比較有意思的思路。咱們也能夠在建立池對象的時候,就建立整個對象集合,這樣還能夠減小內存碎片,提升內存的使用效率。string

相關文章
相關標籤/搜索