设计模式 | 原型模式

简介: 设计模式 | 原型模式

说明

原型模式也是创建型的设计模式,先创建好一个原型对象,然后对他进行拷贝来创建新的对象,这样就免去了类创建是重复初始化操作。原型模式适用于对大对象的创建,大对象每次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);
// 以上也是可行的
  • 深拷贝

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

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

  • 序列化深拷贝

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

  • 浅拷贝

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

目录
相关文章
|
6月前
|
设计模式 安全 Java
面向对象编程的精髓:Java设计模式 - 原型模式(Prototype)完全参考手册
【4月更文挑战第7天】原型模式是OOP中的创建型设计模式,用于通过复制现有实例创建新实例,尤其适用于创建成本高或依赖其他对象的情况。它包括Prototype接口、ConcretePrototype实现和Client客户端角色。优点是性能优化、避免子类化和动态增加产品族。实现包括定义原型接口、实现具体原型和客户端调用克隆方法。最佳实践涉及确保克隆正确性、选择深拷贝或浅拷贝及考虑线程安全。但需注意克隆方法管理、性能开销和循环引用等问题。在Java中,实现Cloneable接口和覆盖clone方法可实现原型模式。
77 4
|
6月前
|
设计模式 Java 关系型数据库
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
|
6月前
|
设计模式 安全 Java
【设计模式】原型模式
【设计模式】原型模式
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
2月前
|
设计模式 Java
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
|
4月前
|
设计模式
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
|
4月前
|
设计模式 JavaScript
js设计模式【详解】—— 原型模式
js设计模式【详解】—— 原型模式
50 6
|
5月前
|
设计模式 Java
Java设计模式之原型模式详解
Java设计模式之原型模式详解
|
5月前
|
设计模式
原型模式-大话设计模式
原型模式-大话设计模式
|
5月前
|
设计模式 Java Spring
设计模式——原型模式
设计模式——原型模式

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    53
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    37
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    61
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    56
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    40
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    105
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    75