学习php设计模式 php实现原型模式(prototype)


Posted in PHP onDecember 07, 2015

一、意图
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
二、原型模式结构图

学习php设计模式 php实现原型模式(prototype)

三、原型模式中主要角色
抽象原型(Prototype)角色:声明一个克隆自身的接口

具体原型(Concrete Prototype)角色:实现一个克隆自身的操作

四、原型模式的优点和缺点
Prototype模式优点
1、可以在运行时刻增加和删除产品
2、可以改变值以指定新对象
3、可以改变结构以指定新对象
4、减少子类的构造
5、用类动态配置应用

Prototype模式的缺点
Prototype模式的最主要缺点就是每一个类必须配备一个克隆方法。
而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事。

五、原型模式适用场景
1、当一个系统应该独立于它的产品创建、构成和表示时,要使用Prototype模式
2、当要实例化的类是在运行时刻指定时,例如动态加载
3、为了避免创建一个与产品类层次平等的工厂类层次时;
4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些

六、原型模式与其它模式

抽象工厂模式(abstract factory模式):Abstract Factory模式与Prototype模式在某种方面是相互竞争的,但是也可以一起使用。

七、原型模式PHP示例

<?php
/**
 * 抽象原型角色
 */
interface Prototype {
 public function copy();
}
 
/**
 * 具体原型角色
 */
class ConcretePrototype implements Prototype{
 
 private $_name;
 
 public function __construct($name) {
 $this->_name = $name;
 }
 
 public function setName($name) {
 $this->_name = $name;
 }
 
 public function getName() {
 return $this->_name;
 }
 
 public function copy() {
 /* 深拷贝实现
 $serialize_obj = serialize($this); // 序列化
 $clone_obj = unserialize($serialize_obj); // 反序列化       
 return $clone_obj;
 */
 return clone $this; // 浅拷贝
 }
}
 
/**
 * 测试深拷贝用的引用类
 */
class Demo {
 public $array;
}
 
class Client {
 
 /**
 * Main program.
 */
 public static function main() {
 
 $demo = new Demo();
 $demo->array = array(1, 2);
 $object1 = new ConcretePrototype($demo);
 $object2 = $object1->copy();
 
 var_dump($object1->getName());
 echo '<br />';
 var_dump($object2->getName());
 echo '<br />';
 
 $demo->array = array(3, 4);
 var_dump($object1->getName());
 echo '<br />';
 var_dump($object2->getName());
 echo '<br />';
 
 }
 
}
 
Client::main();
?>

补充:浅拷贝与深拷贝

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

深拷贝
被拷贝对象的所有的变量都含有与原来对象相同的值,除了那些引用其他对象的变量。那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原有那些被引用对象。
即 深拷贝把要拷贝的对象所引用的对象也都拷贝了一次,而这种对被引用到的对象拷贝叫做间接拷贝。
深拷贝要深入到多少层,是一个不确定的问题。
在决定以深拷贝的方式拷贝一个对象的时候,必须决定对间接拷贝的对象是采取浅拷贝还是深拷贝还是继续采用深拷贝。
因此,在采取深拷贝时,需要决定多深才算深。此外,在深拷贝的过程中,很可能会出现循环引用的问题。

利用序列化来做深拷贝
利用序列化来做深拷贝,把对象写到流里的过程是序列化(Serilization)过程,但在业界又将串行化这一过程形象的称为“冷冻”或“腌咸菜”过程;而把对象从流中读出来的过程则叫做反序列化(Deserialization)过程,也称为“解冻”或“回鲜”过程。
在PHP中使用serializeunserialize函数实现序列化和反序列化。

在上面的代码中的注释就是一个先序列化再反序列化实现深拷贝的过程。

以上就是使用php实现原型模式的代码,还有一些关于原型模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
PHP实现采集程序原理和简单示例代码
Mar 18 PHP
PHP 地址栏信息的获取代码
Jan 07 PHP
PHP多例模式介绍
Jun 24 PHP
yii实现图片上传及缩略图生成的方法
Dec 04 PHP
php短址转换实现方法
Feb 25 PHP
php简单实现多字节字符串翻转的方法
Mar 31 PHP
PHP使用逆波兰式计算工资的方法
Jul 29 PHP
PHP中串行化用法示例
Nov 16 PHP
PHP从数组中删除元素的四种方法实例
May 12 PHP
php文件上传类的分享
Jul 06 PHP
php无限级评论嵌套实现代码
Apr 18 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
Feb 21 PHP
PHP中Enum(枚举)用法实例详解
Dec 07 #PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 #PHP
学习php设计模式 php实现门面模式(Facade)
Dec 07 #PHP
php实现smarty模板无限极分类的方法
Dec 07 #PHP
学习php设计模式 php实现单例模式(singleton)
Dec 07 #PHP
学习php设计模式 php实现桥梁模式(bridge)
Dec 07 #PHP
学习php设计模式 php实现装饰器模式(decorator)
Dec 07 #PHP
You might like
PHP实现图片旋转效果实例代码
2014/10/01 PHP
简单概括PHP的字符串中单引号与双引号的区别
2016/05/07 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
pjblog修改技巧汇总
2007/03/12 Javascript
Add Formatted Text to a Word Document
2007/06/15 Javascript
jQuery 使用手册(二)
2009/09/23 Javascript
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
2010/08/24 Javascript
Jquery时间验证和转换工具小例子
2013/07/01 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
简单谈谈node.js 版本控制 nvm和 n
2015/10/15 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
Node.js创建Web、TCP服务器
2017/12/05 Javascript
简述vue中的config配置
2018/01/23 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
python中的对象拷贝示例 python引用传递
2014/01/23 Python
python通过getopt模块如何获取执行的命令参数详解
2017/12/29 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
python3爬取torrent种子链接实例
2020/01/16 Python
TensorFlow学习之分布式的TensorFlow运行环境
2020/02/05 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
创建索引时需要注意的事项
2013/05/13 面试题
房屋过户委托书范本
2014/10/07 职场文书
物业工程部岗位职责
2015/02/11 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python
Python道路车道线检测的实现
2021/06/27 Python
mysql幻读详解实例以及解决办法
2022/06/16 MySQL