PHP设计模式——享元模式

PHP设计模式——享元模式

声明:本系列博客参考资料《大话设计模式》,作者程杰。

享元模式使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。

UML类图:

www.zeeklog.com  - PHP设计模式——享元模式

角色分析:

  • 享元工厂角色(FWFactory):创建并管理BlogModel对象。
  • 所有具体享元父接口角色(BolgModel):接受并作用与外部状态。
  • 具体享元角色(JobsBlog):具体变化点,为内部对象增加储存空间。

代码实现:

<?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;
            }

        }
    }
}

客户端调用代码:

header("Content-Type:text/html;charset=utf-8");
//------------------------门面模式测试代码------------------
require_once "./Flyweight/Flyweight.php";
$factory=new BlogFactory();
$jobs=$factory->getBlogModel("JobsBlog");
if($jobs)
{
    $jobs->showTime();
    $jobs->showColor();
}

$leijun=$factory->getBlogModel("LeiJunBlog");
if($leijun)
{
    $leijun->showTime();
    $leijun->showColor();
}

$aFanda=$factory->getBlogModel("aFanda");
if($aFanda)
{
    $aFanda->showTime();
    $aFanda->showColor();
}

优点:

1.减少运行时对象实例的个数,节省内存 2.将许多“虚拟”对象的状态集中管理

缺点:

一旦被实现,单个的逻辑实现将无法拥有独立而不同的行为

适用场景:

当一个类有许多的实例,而这些实例能被同一方法控制的时候,我们就可以使用享元模式。

Read more

超快速,使用ChatGPT编写回归和分类算法

超快速,使用ChatGPT编写回归和分类算法

本文将使用一些 ChatGPT 提示,这些提示对于数据科学家在工作时非常重要。 微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩 以下是一些示例ChatGPT 提示的列表以及数据科学家的响应。 ChatGPT 提示 为决策树回归算法生成 python 代码。 下面是使用scikit-learn在 Python 中进行决策树回归的示例代码: import numpy as np import matplotlib.pyplot as plt from sklearn.tree import DecisionTreeRegressor # Generate random data rng = np.random.default_rng() x = 5 * rng.random(100) y = np.sin(x) + 0.

By Ne0inhk
力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

993.二叉树的堂兄弟节点 难度:简单 题目: 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。 我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。 只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。 示例: 示例 1: 输入:root = [1,2,3,4], x = 4, y = 3 输出:false

By Ne0inhk
1239.串联字符串的最大长度 关于字符串的回溯算法!

1239.串联字符串的最大长度 关于字符串的回溯算法!

题目: 给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串, 如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解。 请返回所有可行解 s 中最长长度。 提示: 1 <= arr.length <= 16 1 <= arr[i].length <= 26 arr[i] 中只含有小写英文字母 示例: 示例 1: 输入:arr = ["un","iq","ue"] 输出:4 解释:所有可能的串联组合是

By Ne0inhk