学习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中$_SERVER的详细参数与说明
Jul 29 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
Jun 24 PHP
PHP生成sitemap.xml地图函数
Nov 13 PHP
ThinkPHP3.1新特性之G方法的使用
Jun 19 PHP
一个经典实用的PHP图像处理类分享
Nov 18 PHP
PHP使用file_get_content设置头信息的方法
Feb 14 PHP
支付宝服务窗API接口开发php版本
Jul 20 PHP
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
May 23 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
php关联数组与索引数组及其显示方法
Mar 12 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
Aug 06 PHP
PHP实现考试倒计时功能代码
Apr 16 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中的日期及时间
2006/11/23 PHP
php修改上传图片尺寸的方法
2015/04/14 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
2019/10/15 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
javascript 写类方式之十
2009/07/05 Javascript
javascript 冒泡排序 正序和倒序实现代码
2010/12/14 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
2015/05/18 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
在 Angular 中实现搜索关键字高亮示例
2017/03/21 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
vue调用语音播放的方法
2019/09/27 Javascript
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
Python编程中的异常处理教程
2015/08/21 Python
教你用Python创建微信聊天机器人
2020/03/31 Python
pandas通过索引进行排序的示例
2018/11/16 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
Pytorch evaluation每次运行结果不同的解决
2020/01/02 Python
python实现处理mysql结果输出方式
2020/04/09 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
LODI女鞋在线商店:阿利坎特的鞋类品牌
2019/02/15 全球购物
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
大学运动会通讯稿
2014/01/28 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
React四级菜单的实现
2022/04/08 Javascript