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;

/*输出
张三
张三
张三
---------------
李四
李四
张三
---------------
小琴
王五
王五
---------------*/
相关推荐
阿坤带你走近大数据2 分钟前
分别介绍下java主流的开发框架、设计模式与对应编程语言的高级特性
java·开发语言·设计模式
Leweslyh7 分钟前
《3GPP TS 28.312 面向移动网络的意图驱动管理服务》完整自学教程
开发语言·网络·php
geovindu32 分钟前
go: Coroutines Pattern
开发语言·后端·设计模式·golang·协程模式
Godspeed Zhao39 分钟前
跨越天际:从智能汽车到 eVTOL 的适航与系统级开发21——时间触发以太网(TTE)与 ARINC 664(AFDX)
架构·汽车·php
swordbob1 小时前
prototype 注入到 singleton 里,prototype是否还是线程安全的
安全·spring·单例模式·原型模式
Anastasiozzzz1 小时前
构建健壮软件系统的基石:深入解析面向对象设计七大原则
开发语言·javascript·设计模式·ecmascript
zimoyin1 小时前
Webman 的 PHP 打包构建脚本:编译二进制、归档备份、生成校验包(附完整源码+解析)
php
酉鬼女又兒18 小时前
零基础入门计算机网络:网络层核心任务、三大关键问题、两种服务类型与 TCP/IP 网际层协议体系全解析
服务器·网络·网络协议·tcp/ip·计算机网络·php·求职招聘
神仙别闹19 小时前
基于 PHP + MySQL学生信息管理系统
android·mysql·php
qq_2975746721 小时前
设计模式系列文章(基础篇第19篇):中介者模式——封装交互关系,解耦网状依赖
设计模式·交互·中介者模式