PHP设计模式——享元模式(Flyweight Pattern)

享元,这个两个字不太好理解,从它的英文名称倒是比较贴切。它可以避免重复创建相同的对象即可以节省内存、提高性能。

其实有点类似单例模式,获取一个对象(或者数据)时候会先检查是否已经过。但不同的地方是单例是判断一个类是否实例化过,而享元是判断要实例化的对象(可以是单个/多个对象或数据)是否已经存在。

<?php
/**
 * Created by PhpStorm.
 * User: LYL
 * Date: 2015/5/16
 * Time: 12:00
 */

/**所有享元父接口角色
 * Interface IBlogModel
 */
interface IBlogModel
{
    function showTime();
    function showColor();
}

/**乔布斯的博客模板
 * Class JobsBlog
 */
class JobsBlog implements IBlogModel
{
    function showTime()
    {
        echo "纽约时间:5点整<br/>";
    }

    function showColor()
    {
        echo "<div style='color: #006600;height: 30;width: 30;background-color: #898989;'>Jobs</div>";
    }
}

/**雷军博客模板
 * Class LeiJunBlog
 */
class LeiJunBlog implements IBlogModel
{
    function showTime()
    {
        echo "北京时间:17点整<br/>";
    }

    function showColor()
    {
        echo "<div style='color:#c7254e;height: 30;width: 100;background-color: #898989;'>雷军</div>";
    }
}

/**博客模板工厂
 * Class BlogFactory
 */
class BlogFactory
{
    private $model=array();

    function getBlogModel($name)
    {
        if(isset($this->model[$name]))
        {
            echo "我是缓存里的<br/>";
            return $this->model[$name];
        }
        else
        {
            try
            {
                echo "我是新创建的<br/>";
                $class=new ReflectionClass($name);
                $this->model[$name]=$class->newInstance();
                return $this->model[$name];
            }
            catch(ReflectionException $e)
            {
                echo "<span style='color: #ff0000;'>你要求的对象我不能创建哦。</span><br/>";
                return null;
            }

        }
    }
}

发表评论