专栏首页憧憬博客分享设计模式 | 原型模式

设计模式 | 原型模式

说明

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

示例

<?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);

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

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

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

  • 序列化深拷贝

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

  • 浅拷贝

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式 | 组合模式

    模式定义: 组合模式(Composite Pattern)有时候又叫做部分-整体模式,用于将对象组合成树形结构以表示“部分-整体”的层次关系。组合模式使得用户对...

    憧憬博客
  • SpringBoot thymeleaf自定义错误页面

    憧憬博客
  • SpringBoot 配置文件编写及使用方式 (拒绝硬编码)

    我们经常在项目开放中需要进行很多配置, 那么这些配置基本上都是动态的, 如果我直接写在代码中, 修改起来很麻烦, 如果该配置在多处进行引用啦, 你估计会杀了写代...

    憧憬博客
  • 面试题系列第7篇:Java方法到底是值传递还是引用传递?

    这个问题一直在技术讨论区争论不休。对于初级人员来说很具有迷惑性,即便对于很多高级开发来说,也搞不清楚。本篇文章就带大家探究一下底层的原理,最终化繁为简,让大家通...

    程序新视界
  • Serializable和Externalizable浅析

    Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。从而达到网络传输、本地存储的效果。

    孟君
  • spark-submit提交Spark Streamming+Kafka程序

    董可伦
  • 私有化镜像库的验证(转)

    domain0
  • Valve 推出 Steam Audio SDK,支持Unity

    Valve 近日宣布推出 Steam Audio SDK,这是一款V社称为“增强所有互动的产品,特别是VR应用”的空间音频插件。该公司已经推出了SDK的测试版,...

    BestSDK
  • RESTframework_一

    版权声明:Copyright © ...

    zhengzongwei
  • Oracle 10g 流复制(Streams Replication)配置

    Oracle 流是一种数据共享的通用机制,可以被用于许多处理的基础,包括消息、复制和数据仓库的 ETL 过程。它是高级队列、LogMinor、作业调度等已存在技...

    用户1148526

扫码关注云+社区

领取腾讯云代金券