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;

/*输出
张三
张三
张三
---------------
李四
李四
张三
---------------
小琴
王五
王五
---------------*/
相关推荐
aixingpan7 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
4SAPI13 小时前
多国产模型混合调度与企业级治理生产选型指南:4SAPI、硅基流动与 OpenRouter 的架构权衡
大数据·人工智能·架构·php
tommyjiatong17 小时前
资安底座连环雷:从 PHP2Shell 到 Node2Shell
node.js·php
青峰讲运维17 小时前
OpenStack Heat 编排:用模板一键交付云业务,告别手动点页面
开发语言·php·openstack
协作者18 小时前
PHP根本影响不到Domino
php·oidc·domino·notes·inotes·verse
神仙别闹18 小时前
基于Python+MySQL实现(Web)个人博客系统
python·mysql·php
dingzd9519 小时前
TikTok账号登录态失效的Cookie字段排查路径
开发语言·php·跨境电商·营销策略
vipxieliang20 小时前
Laravel 框架内核:请求生命周期、IoC 容器与中间件管道(附 ThinkPHP 选型对比)
php
是2的10次方啊20 小时前
设计模式与生活⑦:你打的车,隔着一个平台
设计模式
忆~遂愿20 小时前
极空间部署XiaoMusic:把NAS里的本地音乐接入小爱音箱,搜索、播放和远程控制一起完成
php