• php设计模式 -- 原型模式


    原型模式(Prototype Pattern):与工厂模式类似,都是用来创建对象的。利用克隆来生成一个大对象,减少创建时的初始化等操作占用开销

    (一)为什么需要原型模式

    1,有些时候,我们需要创建多个类似的大对象。如果直接通过new对象,开销很大,而且new完还得进行重复的初始化工作。可能把初始化工作封装起来的,但是对于系统来说,你封不封装,初始化工作还是要执行。,

    2,原型模式则不同,原型模式是先创建好一个原型对象,然后通过clone这个原型对象来创建新的对象,这样就免去了重复的初始化工作,系统仅需内存拷贝即可。

    缺点

    Prototype是的最主要的缺点就是每一个类必须包含一个克隆方法;

    而且这个克隆方法需要对类的功能进行检测,这对于全新的类来说较容易,但对已有的类进行改造时将不是件容易的事情;

    要点

    1、构建一个原型对象

    2、对其进行初始化

    3、对原型对象进行克隆操作

    代码示例

    <?php
    /**
     * PHP设计模式 原型模式(prototype)
     * User: pyzn
     * Date: 2016-03-22
     * Time: 14:08
     */
    
    /**
     * Class Object
     * 一个结构复杂的对象原型
     */
    class Object
    {
        public function init()
        {
            //一些很占用系统资源的操作
        }
    
        public function run()
        {
    
        }
    
    }
    
    //常规方式
    $obj1 = new Object();
    $obj1->init();
    $obj1->run();
    
    $obj2 = new Object();
    $obj2->init();
    $obj2->run();
    
    //原型模式
    $prototype = new Object();
    $prototype->init();
    
    $obj1 = clone $prototype;
    $obj1->run();
    
    $obj2 = clone $prototype;
    $obj2->run();

    复杂实现

    /**
     * PHP设计模式 原型模式(prototype)的复杂实现
     * User: pyzn
     * Date: 2016-03-22
     * Time: 14:08
     */
    
    /**
     * Interface IPrototype
     * 声明一个克隆自身的接口,对原型角色的抽象
     */
    interface IPrototype
    {
        public function copy();
    }
    
    class PrototypeObject implements IPrototype
    {
        private $name;
    
        public function __construct($name)
        {
            $this->name = $name;
        }
    
        public function setName($name)
        {
            $this->name = $name;
        }
    
        public function getName()
        {
            return $this->name;
        }
    
        public function copy()
        {
            /*
             * 浅copy
             */
            //return clone $this;
    
            /*
             * 深copy
             */
            $serializeStr = serialize($this);
            $cloneObj = unserialize($serializeStr);
    
            return $cloneObj;
        }
    }
    
    
    class Client
    {
        public static function main()
        {
            $prototype = new PrototypeObject("test");
    
            $pro1 = $prototype->copy();
            $pro2 = $prototype->copy();
    
            $pro2->setName("test2");
    
            var_dump($pro1);
            var_dump($pro2);
        }
    }
    
    Client::main();

    object(PrototypeObject)#2 (1) {
      ["name":"PrototypeObject":private]=> string(5) "test" }
    object(PrototypeObject)#3 (1) {
      ["name":"PrototypeObject":private]=> string(4) "test2" }
  • 相关阅读:
    Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动
    dubbox注解的一个坑
    内嵌Tomcat的Connector对象的静态代码块
    Spring Boot启动过程(三)
    Spring Boot启动过程(二)
    Spring Boot启动过程(一)
    SpringMVC基础学习(二)—开发Handler
    JS弹出框
    Oracle的基本学习(三)—函数
    Oracle的基本学习(二)—基本查询
  • 原文地址:https://www.cnblogs.com/mmmzh/p/10102323.html
Copyright © 2020-2023  润新知