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;

/*输出
张三
张三
张三
---------------
李四
李四
张三
---------------
小琴
王五
王五
---------------*/
相关推荐
国强_dev4 小时前
量体裁衣在技术方案中的应用
设计模式·系统架构
Engineer邓祥浩7 小时前
设计模式学习(16) 23-14 命令模式
学习·设计模式·命令模式
Maddie_Mo7 小时前
智能体设计模式 第二章:路由模式
设计模式
嗨 ! 海洋9 小时前
K8S创建pod,CNI插件的网络配置过程
网络·kubernetes·php
w***76559 小时前
PHP8.4重磅升级:性能翻倍新特性
php
运筹vivo@10 小时前
攻防世界: catcat-new
前端·web安全·php
一条闲鱼_mytube11 小时前
智能体设计模式(五)人机协同-知识检索RAG-智能体间通信
网络·人工智能·设计模式
小码过河.11 小时前
设计模式——建造者模式
单片机·设计模式·建造者模式
CS创新实验室11 小时前
《计算机网络》深入学:轮询和令牌传递协议
开发语言·计算机网络·考研·php·408
运筹vivo@12 小时前
攻防世界: ics-05
前端·web安全·php