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

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

三、原型模式中主要角色
抽象原型(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
, 设计模式
原型模式
,以便于您获取更多的相关知识。

时间: 2024-09-16 09:45:44

学习php设计模式 php实现原型模式(prototype)_php技巧的相关文章

学习php设计模式 php实现合成模式(composite)_php技巧

一.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使用户对单个对象和组合对象的使用具有一致性. Composite变化的是一个对象的结构和组成.二.合成模式中主要角色抽象组件(Component)角色:抽象角色,给参加组合的对象规定一个接口.在适当的情况下,实现所有类共有接口的缺省行为.声明一个接口用于访问和管理Component的子组件树叶组件(Leaf)角色:在组合中表示叶节点对象,叶节点没有子节点.在组合中定义图元对象的行为.树枝组件(Composi

学习php设计模式 php实现备忘录模式(Memento)_php技巧

一.意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样可以在以后把该对象的状态恢复到之前保存的状态. 二.备忘录模式结构图 三.备忘录模式中主要角色1.备忘录(Memento)角色: 存储发起人(Originator)对象的内部状态,而发起人根据需要决定备忘录存储发起人的哪些内部状态. 备忘录可以保护其内容不被发起人(Originator)对象之外的任何对象所读取.2.发起人(Originator)角色:创建一个含有当前的内部状态的备忘录对象 使用备忘录对象存

学习php设计模式 php实现策略模式(strategy)_php技巧

一.意图定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.策略模式可以使算法可独立于使用它的客户而变化 策略模式变化的是算法二.策略模式结构图   三.策略模式中主要角色 抽象策略(Strategy)角色:定义所有支持的算法的公共接口.通常是以一个接口或抽象来实现.Context使用这个接口来调用其ConcreteStrategy定义的算法 具体策略(ConcreteStrategy)角色:以Strategy接口实现某具体算法 环境(Context)角色:持有一个Strategy类的

学习php设计模式 php实现桥梁模式(bridge)_php技巧

一.桥梁模式结构图   二.桥梁模式中主要角色 抽象化(Abstraction)角色:定义抽象类的接口并保存一个对实现化对象的引用. 修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义. 实现化(Implementor)角色:定义实现类的接口,不给出具体的实现.此接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以完全不同.实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作. 具体实现化(Concrete

.Net设计模式实例之原型模式( Prototype Pattern)

一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype. 浅复制与深复制区别: 浅复制,被复制的所有变量都还有与原来对象相同的值,而所有的对其他对象的

浅谈Java设计模式关于原型模式(Prototype)思索建议

java教程:关于Java设计模式关于原型模式(Prototype) IT信息技术http://www.52ij.com/jishu/ 首先需要弄清楚什么叫原型模式,或者说为什么要有原型模式,运用它会给我们带来什么或能解决什么问题?原型模式(Prototype)同抽象工厂模式同属于创建型模式,它主要关注于大量相同或相似对象的创建问题,应用原型模式就是先需要一个原对象,然后通过对原对象进行复制(克隆),来产生一个与原对象相同或相似的新对象.注意这里所说的对象相同不是指复制出来的副本对象与原对象是同

设计模式(四)原型模式Prototype(创建型)

设计模式(四)原型模式Prototype  1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象. 例子1:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:"给我寄个快递."顾客说."寄往什么地方?寄给--?"你问.&qu

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

原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. 示例 有一个Message实体类,现在要克隆它. MessageModel using System;using System.Collections.Generic;using System.Text;namespac

PHP设计模式之:原型模式学习笔记

原型模式其实和工厂模式比较类似,都是用来创建对象的,只不过与工厂模式的实现不同.原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象.这样就免去了类创建时重复的初始化操作了.原型模式适用于大对象的创建,因为在创建一个大对象时,需要很大的开销.如果每次都去new就会消耗很大,原型模式仅需从内存拷贝既可. 还是继续通过实例来向大家演示一下 <?php /**  * 抽象原型角色  */ interface Prototype {     public function clone