• 原型模式及php实现



    原型模式:

      通过复制已经存在的实例来返回新的实例,而不是新建实例,并且原型(被复制的实例)是可定制的;原型模式多用于创建复杂的或耗时的实例,这种情况下,复制一个已经存在的实例是程序运行更高效无疑是一种好办法;
    主要角色:
      抽象原型角色(Prototype):声明一个克隆自身的接口
      具体原型角色(ConcretePrototype):实现一个克隆自身的操作

    UML图:

      clip_image004

    //方案一:
    interface Prototype{
      function copy();
    }
    class ConcretePrototype implements Prototype{
      public $time;
      public $people; //对象
      function __construct($time,$people){
        $this->time = $time;
        $this->people = $people;
      }
    
      //序列化和反序列化对象实现复制,深度复制
      function copy(){
        return unserialize(serialize($this));
      }
    }
    //方案二:
    class ConcretePrototype implements Prototype{
      public $time;
      public $people; //对象
      function __construct($time,$people){
        $this->time = $time;
        $this->people = $people;
      }
    
    //在克隆前调用,将所有子对象进行深度复制,不过当子对象较多或者层次较深时比较麻烦
      function __clone(){
        $this->people = new people("zhangsang");
      }  
    }
    
    //测试:
    class People{
      public $name;
      function __construct($name){
        $this->name = $name;
      }
    }
    $prototype = new ConcretePrototype("2016/5/26",new People("zhangsang"));
    // $clonePrototype = clone $prototype;
    $clonePrototype = $prototype->copy();
    echo $clonePrototype->people->name;
    $prototype->people->name = "lisi";
    echo $clonePrototype->people->name;
    ?>

    Prototype模式优点:
      1、可以在运行时刻增加和删除产品
      2、可以改变值或结构以指定新对象
      3、减少子类的构造
      4、用类动态配置应用

    Prototype模式的缺点:
      Prototype是的最主要的缺点就是每一个类必须包含一个克隆方法;
      而且这个克隆方法需要对类的功能进行检测,这对于全新的类来说较容易,但对已有的类进行改造时将不是件容易的事情;
    适用场景:
      1、当一个系统应该独立于它的产品创建、构成和表示时,要使用Prototype模式
      2、当要实例化的类是在运行时刻指定时,例如动态加载
      3、为了避免创建一个与产品类层次平等的工厂类层次时;
      4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些

  • 相关阅读:
    AOP从静态代理到动态代理 Emit实现
    Emit基础入门 系列文章
    ContextAttribute与ContextBoundObject应用的探究
    吞云吐烦忧
    动态编译代码框架发布CZGL.Roslyn
    AutoMapper 入门
    Attribute在.net编程中的应用
    C#反射与特性 系列文章
    静态代理和动态代理方式分别实现AOP拦截功能
    内网安全攻防:渗透测试指南——第8章 权限维持分析及防御
  • 原文地址:https://www.cnblogs.com/yujon/p/5532840.html
Copyright © 2020-2023  润新知