学习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 出现乱码和Sessions验证问题的解决方法!
Dec 06 PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 PHP
php 读取文件乱码问题
Feb 20 PHP
PHP5与MySQL数据库操作常用代码 收集
Mar 21 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
Apr 19 PHP
mcrypt启用 加密以及解密过程详细解析
Aug 07 PHP
php+ajax实现图片文件上传功能实例
Jun 17 PHP
JavaScript创建命名空间的5种写法
Jun 24 PHP
PHP数组排序之sort、asort与ksort用法实例
Sep 08 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
Jan 22 PHP
深入分析PHP设计模式
Jun 15 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
深入Memcache的Session数据的多服务器共享详解
2013/06/13 PHP
PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 如何解决
2016/04/17 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
Python对List中的元素排序的方法
2018/04/01 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
Python实现猜年龄游戏代码实例
2020/03/25 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
记一次高分屏下canvas模糊问题
2020/02/17 HTML / CSS
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
经济信息管理专业大学生求职信
2013/09/27 职场文书
人事专员的岗位职责
2014/03/01 职场文书
环境保护标语
2014/06/20 职场文书
股份转让协议书范本
2015/01/27 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
云台山导游词
2015/02/03 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书
施工安全责任协议书
2016/03/23 职场文书
合同范本之电脑出租
2019/08/13 职场文书
CSS3常见动画的实现方式
2021/04/14 HTML / CSS
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL
python单元测试之pytest的使用
2021/06/07 Python
Vue3中的Refs和Ref详情
2021/11/11 Vue.js
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL