前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式 | 原型模式

设计模式 | 原型模式

作者头像
憧憬博客
发布2020-07-20 17:18:09
3180
发布2020-07-20 17:18:09
举报
文章被收录于专栏:憧憬博客分享

说明

原型模式也是创建型的设计模式,先创建好一个原型对象,然后对他进行拷贝来创建新的对象,这样就免去了类创建是重复初始化操作。原型模式适用于对大对象的创建,大对象每次new消耗很大,原型模式仅需内存拷贝即可

示例

代码语言:javascript
复制
<?php
/**
 * Created by 憧憬.
 * User: longshilin
 * Date: 2020-01-23
 * Time: 22:00
 */

class Names {

}

class User {
    public $name;

    public function __construct()
    {
        $this->name = new Names();
    }

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

    /**
     * 直接在这个魔术方法也指定需要再次克隆的对象 可以解决这个
     * @author: 憧憬
     */
    public function __clone()
    {
        $this->name = clone $this->name;
    }


}

// 本身php就支持克隆 clone

$user = new User();

$newUser = clone $user;

$user->setName('憧憬');


print_r($user->name);
print_r($newUser->name);
echo PHP_EOL;

// 但是clone操作是一个浅拷贝 我们name这个成员属性是一个对象  当我们去修改这个对象里面属性的时候 克隆的对象也能获取到同一个数据



// 所以我们需要考虑到深拷贝 可以直接添加__clone来解决  还可以利用反序列化

$hUser = new User();
$wUser = unserialize(serialize($hUser));

$hUser->setName('憧憬');

print_r($hUser->name);
print_r($wUser->name);

// 以上也是可行的
  • 深拷贝

被拷贝对象的所有变量都含有原对象的值,除了那些引用其他对象的变量, 那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原来那些引用的对象。即深拷贝把要拷贝的对象所引用的对象也拷贝了一次。而这种对被引用到的对象拷贝叫做间接拷贝。

在决定以深拷贝的方式拷贝一个对象的时候,必须决定对间接拷贝的对象时采取浅拷贝还是深拷贝还是继续采用深拷贝。

  • 序列化深拷贝

利用序列化来做深拷贝,把对象写到流里的过程是序列化的过程,这一过程称为“冷冻”,反序列化对象的过程叫做“解冻”。可以达到深拷贝的效果

  • 浅拷贝

被拷贝对象的所有变量都含有与原对象相同的值,而且与其他对象的引用仍然指向原来的对象,即浅拷贝只负责当前对象实例,对引用对象不做拷贝

本文为作者原创,手码不易,允许转载,转载后请以链接形式说明文章出处。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
  • 示例
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档