zoukankan      html  css  js  c++  java
  • 【php设计模式】享元模式

      享元模式其实就是共享独享模式,减少重复实例化对象的操作,从而将实例化对象造成的内存开销降到最低。

      享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。

    <?php
    
    interface Shape{
        public function draw();
    }
    
    class Circle implements Shape{
        private $color;
        private $num;
    
        public function __construct($color){
            $this->color = $color;
        }
    
        public function draw(){
            echo "this is a {$this->color} circle {$this->num} 
    ";
        }
    
        public function setNum($num){
            $this->num = $num;
        }
    }
    
    class ShapeFactory{
        public static $shape_arr = [];
    
        public static function getShape($color){
            if(!array_key_exists($color,static::$shape_arr)){
                static::$shape_arr[$color] = new Circle($color);
            }
            return static::$shape_arr[$color];
        }
    }
    
    $colors = ["Red", "Green", "Blue", "White", "Black"];
    
    for ($i=0; $i < 20; $i++) {
        $a = $i%5;
        $circle = ShapeFactory::getShape($colors[$a]);
        $circle->setNum($i);
        $circle->draw();
    }

    输出

    this is a Red circle 0
    this is a Green circle 1
    this is a Blue circle 2
    this is a White circle 3
    this is a Black circle 4
    this is a Red circle 5
    this is a Green circle 6
    this is a Blue circle 7
    this is a White circle 8
    this is a Black circle 9
    this is a Red circle 10
    this is a Green circle 11
    this is a Blue circle 12
    this is a White circle 13
    this is a Black circle 14
    this is a Red circle 15
    this is a Green circle 16
    this is a Blue circle 17
    this is a White circle 18
    this is a Black circle 19

      注意:享元模式适用于对象存在时间不长的情况,就像例子中画一个圆形只要这个圆形画完后其对象就没有意义啦,这时我们将这个对象的属性改变后成为一个新的对象是可以的。假设我们是在一个创建游戏人物的场景中使用,当创建了某个类型的英雄人物对象之后,我们想要再创建一个相同类型不同属性的英雄人物时,则不适合使用这种设计模式,因为后来的英雄人物对象会是前一个对象改变属性后生成的,这将导致之前的英雄就不存在啦。

  • 相关阅读:
    docker 之 docker-compose 初探
    docker 之 .net core 镜像制作
    docker 之 registry私有仓库(harbor)
    ASP.NET Core 学习笔记(认证授权)
    ASP.NET Core 学习笔记(http请求处理)
    ASP.NET Core 学习笔记(依赖注入)
    Linux基础编程之网络编程TCP实例
    功能包和CMakeLists.txt
    ROS的主节点(名称服务器)---roscore
    关于ros开发
  • 原文地址:https://www.cnblogs.com/itsuibi/p/11049776.html
Copyright © 2011-2022 走看看