php 原型模式

一,原型模式,就是先创建好一个原型对象,然后通过拷贝原型对象来生成新的对象。适用于大对象的创建,因为每次new一个大对象会有很大的开销,原型模式仅需内存拷贝即可。

原型模式中的主要角色:

1,抽象原型(Prototype)角色:声明一个克隆自身的接口。

2,具体原型(Concrete Prototype)角色:实现一个克隆自身的操作。

二,浅拷贝、深拷贝

浅拷贝: 被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。

即浅拷贝只负责当前对象实例,对引用的对象不做拷贝。

深拷贝: 被拷贝对象的所有的变量都含有与原来对象相同的值,除了那些引用其他对象的变量。那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原有那些被引用对象。

即深拷贝把要拷贝的对象所引用的对象也都拷贝了一次,而这种对被引用到的对象拷贝叫做间接拷贝。

三,例子

php 复制代码
//抽象原型
interface Prototype
{
    public function clone();

    public function deepClone();

}

//具体原型
class Concrete implements Prototype
{
    private $name;

    //浅拷贝
    public function clone()
    {
        return clone $this;
    }
    //深拷贝
    public function deepClone()
    {
        return unserialize(serialize($this));
    }

    public function set($name)
    {
        $this->name = $name;
    }

    public function get()
    {
        if (is_object($this->name)){
            echo $this->name->name.PHP_EOL;
        }else{
            echo $this->name.PHP_EOL;
        }

    }
}
class Name{
    public $name='张三';
}


//当被拷贝的对象有对象引用的时候
$obj = new Concrete();
$objName=new Name();
$obj->set($objName);
$objClone = $obj->clone();
$objDeepClone = $obj->deepClone();

$obj->get();
$objClone->get();
$objDeepClone->get();
echo '---------------'.PHP_EOL;

$objName->name='李四';
$obj->get();
$objClone->get();
$objDeepClone->get();
echo '---------------'.PHP_EOL;

//当被拷贝的对象只有属性变量

$obj->set('王五');
$objClone = $obj->clone();
$objDeepClone = $obj->deepClone();

$obj->set('小琴');
$obj->get();
$objClone->get();
$objDeepClone->get();
echo '---------------'.PHP_EOL;

/*输出
张三
张三
张三
---------------
李四
李四
张三
---------------
小琴
王五
王五
---------------*/
相关推荐
小白不太白95044 分钟前
设计模式之 模板方法模式
java·设计模式·模板方法模式
色空大师1 小时前
23种设计模式
java·开发语言·设计模式
闲人一枚(学习中)1 小时前
设计模式-创建型-建造者模式
java·设计模式·建造者模式
博风2 小时前
设计模式:6、装饰模式(包装器)
设计模式
A_cot2 小时前
理解设计模式与 UML 类图:构建稳健软件架构的基石
microsoft·设计模式·简单工厂模式·工厂方法模式·uml
君败红颜2 小时前
设计模式之创建模式篇
设计模式
闲人一枚(学习中)5 小时前
设计模式-创建型-抽象工厂模式
设计模式·抽象工厂模式
hopetomorrow5 小时前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
网络安全-杰克5 小时前
网络安全概论
网络·web安全·php
不是二师兄的八戒5 小时前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php