github地址:https://github.com/ZQCard/design_pattern
1.先了解什么是浅拷贝与深拷贝
//深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个
//
//浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个 对象作为参数传递时,也是引用传递
//php 对象复制,是复制对象的引用地址,因此使用 $objA = $objB 这种写法时,$objA与$objB会指向相同的内存地址。当$objA 发生变化时,$objB也会受到影响。
//如果我们要$objA对象复制为$objB对象,复制之后,$objA有什么变化,都不会影响$objB。即$objA与$objB是两个独立的对象,但$objB的初始值是由$objA创建的,比较高效的做法是使用clone()方法。
//$objB = clone $objA;
//$objB的值是在$objA基础加$objA事例对象里clone()方法改变后的实例。
//当对象被复制后,所有的属性中的引用保持不变,指向原来的变量 ******
class Demo
{
public $string;
}
//$a = new Demo();
//$a->string = 1;
//$b = clone $a; // 在堆复制一个一摸一样的 其实是两个对象 但是同时指向的$string的地址是不变的
//var_dump($a); // true
//var_dump($b); // false
//var_dump($b == $a); // true
//var_dump($b === $a); // false
 

(1)Prototype.class.php(规范子类接口)

<?php

namespace Prototype;

interface Prototype
{
public function copy();
public function deepCopy();
}

(2)ConcretePrototype.class.php (具体原型)

<?php
namespace Prototype; class ConcretePrototype implements Prototype{ private $_obj; public function __construct($obj)
{
$this->_obj = $obj;
} public function getObj()
{
return $this->_obj;
} public function setObj($obj)
{
$this->_obj = $obj;
} public function copy()
{
return clone $this;
} public function deepCopy()
{
$object = serialize($this);
$cloneObject = unserialize($object);
return clone $cloneObject;
} }

(3)prototype.php(客户端)

<?php

spl_autoload_register(function ($classObj){
$classObj = str_replace('\\','/',$classObj);
include $classObj.".class.php";
}); class Demo
{
public $string;
}
//深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个
//
//浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个 对象作为参数传递时,也是引用传递
//php 对象复制,是复制对象的引用地址,因此使用 $objA = $objB 这种写法时,$objA与$objB会指向相同的内存地址。当$objA 发生变化时,$objB也会受到影响。
//如果我们要$objA对象复制为$objB对象,复制之后,$objA有什么变化,都不会影响$objB。即$objA与$objB是两个独立的对象,但$objB的初始值是由$objA创建的,比较高效的做法是使用clone()方法。
//$objB = clone $objA;
//$objB的值是在$objA基础加$objA事例对象里clone()方法改变后的实例。
//当对象被复制后,所有的属性中的引用保持不变,指向原来的变量
//$a = new Demo();
//$a->string = 1;
//$b = clone $a; // 在堆复制一个一摸一样的 其实是两个对象 但是同时指向的$string的地址是不变的
//var_dump($a); // true
//var_dump($b); // false
//var_dump($b == $a); // true
//var_dump($b === $a); // false use Prototype\ConcretePrototype; // 浅拷贝
$demo = new Demo();
$demo->string = 'card';
$object_first = new ConcretePrototype($demo);
$object_second = $object_first->copy();
echo '<pre/>';
var_dump($object_first->getObj() == $object_second->getObj()); // true
var_dump($object_first->getObj() === $object_second->getObj());// true // 深拷贝
$demo = new Demo();
$demo->string = 'card';
$object_first = new ConcretePrototype($demo);
$object_second = $object_first->deepCopy();
echo '<pre/>';
var_dump($object_first);
var_dump($object_second);
var_dump($object_first->getObj() == $object_second->getObj()); // true
var_dump($object_first->getObj() === $object_second->getObj());// false

设计模式之原型模式(php实现)的更多相关文章

  1. 设计模式_11_原型模式(prototype)深拷贝、浅拷贝

    设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...

  2. C#设计模式(6)——原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  3. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  4. C#设计模式之六原型模式(Prototype)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  5. C#设计模式之五原型模式(Prototype Pattern)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  6. C#设计模式(6)——原型模式(Prototype Pattern)(转)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  7. C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone

    C#设计模式(6)——原型模式(Prototype Pattern)   一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...

  8. JAVA 设计模式之原型模式

    目录 JAVA 设计模式之原型模式 简介 Java实现 1.浅拷贝 2.深拷贝 优缺点说明 1.优点 2.缺点 JAVA 设计模式之原型模式 简介 原型模式是六种创建型设计模式之一,主要应用于创建相同 ...

  9. C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone

    C# Json反序列化   Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...

  10. GOF23设计模式之原型模式

    GOF23设计模式之原型模式 1)通过 new 产生一个对象需要飞船繁琐的数据准备或访问权限,则可以使用原型模式. 2)就算 java 中的克隆技术,以某个对象为原型,复制出新的对象.显然,新的对象具 ...

随机推荐

  1. [bzoj] 1878 HH的项链 || 莫队

    原题 给定长为 n 的一个序列,接下来 m 次询问,每次询问区间 [ l , r ] 内有多少个不同的数. 莫队: 离线\(O(n\log(n))\). 将序列分块. 以左端点所在块为第一关键字,右端 ...

  2. 看angualrjs源码中怎么判断所属的类型

    下面是angualrjs的代码: function isFile(obj) { return toString.call(obj) === '[object File]'; } function is ...

  3. 如何用cookie保存用户的登录的密码和用户名

    思路:绘制一个简单的登录界面的Servlet并要在此页面中读取保存密码和用户名的cookie--->在登录处理界面的servlet中把用户名和密码保存到cookie中 //登录界面的Servle ...

  4. bzoj 3160 万径人踪灭 FFT

    万径人踪灭 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1936  Solved: 1076[Submit][Status][Discuss] De ...

  5. Linux下mknod详解

    mknod - make block or character special filesmknod [OPTION]... NAME TYPE [MAJOR MINOR] option 有用的就是 ...

  6. Struts2---ActionContext和ServletActionContext小结

    转载自:http://www.cnblogs.com/tanglin_boy/archive/2010/01/18/1650871.html感谢原文作者的总结 1. ActionContext 在St ...

  7. UVA10154 Weights and Measures

    https://vjudge.net/problem/UVA-10154 ↑Vjudge大法好 堆一个乌龟塔.每只乌龟有重量w和承重能力s(也要承受自己的重量,所以实际可托起s-w),问最多能堆几只乌 ...

  8. Python数据结构——栈

    栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构. 由于栈具有后入先出的特点,所以任何不在栈顶的元素 ...

  9. Linux内存管理之mmap详解 【转】

    转自:http://blog.chinaunix.net/uid-26669729-id-3077015.html 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进 ...

  10. List<?>和List<Class<?>>区别及泛型相关

    ?表示是任意类型,但是编译器不能确定他是什么类型,所以你add的时候什么参数也不能传给它Class<?>表示任意类型的Class对象,list里面可以添加任何类型的Class对象,其它的对 ...