设计模式(三) 原型模式

原理:https://blog.csdn.net/xingjiarong/article/details/50047443

示例:https://www.cnblogs.com/ddddemo/p/5623213.html

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。简单的说,就是克隆一个对象。适用于大对象的创建,因为创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可

克隆对象分为两种,一种是简单复制,另一种是深度复制。

简单复制:即直接用clone函数复制一个对象,但这个方法只会复制简单类型的数据,复杂类型的数据仍然是引用。

深度复制:将对象序列化后再反序列化回来。使用serialize(),unserialize()这两个函数

具体实现就是在原型类中添加一个克隆自身的方法。

<?php
interface Prototype
{
    public function shallowCopy();
    public function deepCopy();
}
class ConcretePrototype implements Prototype
{
    private $_name;
    public function __construct($name)
    {
        $this->_name = $name;
    }
    
    public function setName($name)
    {
        $this->_name = $name;
    }
    public function getName()
    {
        return $this->_name;
    }
    /**
     * 浅拷贝
     * */
    public function shallowCopy()
    {
        
        return clone $this;
        
    }
    /**
     * 深拷贝
     * */
    public function deepCopy()
    {
        $serialize_obj = serialize($this);
        $clone_obj = unserialize($serialize_obj);
        return $clone_obj;
    }
}

class Demo
{
    public $string;
}
class UsePrototype
{
    public function shallow()
    {
        $demo = new Demo();
        $demo->string = "susan";
        $object_shallow_first = new ConcretePrototype($demo);
        $object_shallow_second = $object_shallow_first->shallowCopy();
        
        var_dump($object_shallow_first->getName());
        echo "\n\n";
        var_dump($object_shallow_second->getName());
        echo "\n\n";
        
        $demo->string = "sacha";
        var_dump($object_shallow_first->getName());
        echo "\n\n";
        var_dump($object_shallow_second->getName());
        echo "\n\n";
        
    }
    
    public function deep()
    {
        $demo = new Demo();
        $demo->string = "Siri";
        $object_deep_first = new ConcretePrototype($demo);
        $object_deep_second = $object_deep_first->deepCopy();
    
        var_dump($object_deep_first->                            ());
        echo "\n\n";
        var_dump($object_deep_second->getName());
        echo "\n\n";
    
        $demo->string = "Demo";
        var_dump($object_deep_first->getName());
        echo "\n\n";
        var_dump($object_deep_second->getName());
        echo "\n\n";
    
    }
    
}

$up = new UsePrototype();
// $up->shallow();
echo "\n\n";
$up->deep();

猜你喜欢

转载自blog.csdn.net/qq_35845964/article/details/84940378