`

clone的原型模式(Prototype Pattern)

阅读更多

发邮件的功能想必都做过,发邮件相当的耗时,于是大多使用多线程来实现。但假设产生第一封邮件对象,放到线程1中运行,还没有发送出去,线程2也启动了,直接把邮件对象修改了,线程不安全了。在这里我使用原型模式来解决

<?php
class Mail{
	private $title;
	private $content;
	private $receiver;
	public function setTitle($title){
		$this->title = $title;
	}
	public function getTitle(){
		return $this->title;
	}
	public function setContent($content){
		$this->content = $content;
	}
	public function getContent(){
		return $this->content;
	}
	public function setReceiver($receiver){
		$this->receiver = $receiver;
	}
	public function getReveiver(){
		return $this->receiver;
	}
	public function sendMail(){
		echo "内容为:".$this->content."的邮件已发送至".$this->receiver."\n";
	}
}
$mail = new Mail();
$mail->setTitle('测试');
$i = 0;
while ($i<5) {//这里是例子,真实情况换为遍历用户
	$cloneMail = clone $mail;//克隆一个邮件对象
	$receiver = rand();
	$cloneMail->setReceiver($receiver);
	$cloneMail->setContent($receiver.'你好:......');
	$cloneMail->sendMail();
	$i++;
}
?>
运行结果:
内容为:32436你好:......的邮件已发送至32436
内容为:31453你好:......的邮件已发送至31453
内容为:22098你好:......的邮件已发送至22098
内容为:27939你好:......的邮件已发送至27939
内容为:21024你好:......的邮件已发送至21024
[Finished in 0.1s]

 通过克隆一个对象,可以将线程中的对象相隔离,因此互不影响。

 

 

原型模式的定义

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。太简单了,原型模式的核心是一个clone方法,通过该方法进行对象的拷贝,php5中提供了一个魔术方法__clone。

 

 

原型模式的优点

1、性能优良

原型模式是在内存二进制流的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环体内产生大量的对象时,原型模式可以更好地体现其优点 。

2、逃避构造函数的约束

这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的。优点就是减少了约束,缺点也是减少了约束,需要在实际应用中考虑

 

 

原型模式的使用场景

1、资源优化场景

类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等2

2、性能和安全要求的场景

通过new产生一个对象需要繁琐的数据准备或访问权限,则可以使用原型模式。

3、一个对象多个修改者的场景

一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型式拷贝多个对象供调用者使用。

在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者。

 

 

原型模式的注意事项

1、构造函数不会被执行

2、浅复制和深复制

使用clone来复制对象,这种复制叫做“浅复制”:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。也就是说,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。相对于浅复制,当然也有一个深复制:被复制的对象的所有的变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。也就是说,深复制把要复制的对象所引用的对象都复制了一遍。深复制需要决定深入到多少层,这是一个不容易确定的问题,此外可有会出现循环引用的问题,这些都必须小心处理。

3、clone和final两个冤家

尝试在类的一个成员变量加final,将会Cannot declare property Mail::$title final, the final modifier is allowed only for methods and classes这种类型的错误。要想使用clone方法,类的成员变量上不要增加final关键字

 

 

2
0
分享到:
评论

相关推荐

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

    即原型模式,提供一个已经存在的对象进行新对象创建的接口,一般情况下都是使用Clone接口。 此模式非常简单,简单的说就是复制多个当前对象供使用。Prototype模式允许一个对象再创建另外一个可定制的对象,根本...

    原型模式实践代码

    原型模式实践代码

    php示例详解Constructor Prototype Pattern 原型模式

    原型模式中主要角色 抽象原型(Prototype)角色:声明一个克隆自己的接口 具体原型(Concrete Prototype)角色:实现一个克隆自己的操作 当一个类大部分都是相同的只有部分是不同的时候,如果需要大量这个类的对象,...

    详解Java中的clone方法?原型模式

     clone顾名思义是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建...

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】

    * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 CloneNotSupportedException) * 注意: * 1.被克隆对象.clone()出的对象,是被克隆...

    php设计模式 Prototype (原型模式)代码

    php /** * 原型模式 * * 用原型实例指定创建对象的种类.并且通过拷贝这个原型来创建新的对象 * */ abstract class Prototype { private $_id = null; public function __construct($id) { $this-&gt;_id = $id; } ...

    47丨原型模式:如何最快速地clone一个HashMap散列表?1

    47丨原型模式:如何最快速地clone一个HashMap散列表?1

    Java原型设计模式(Prototype)

     原型模式(Prototype)是通过复制一个已经存在的实例来返回新的实例,而不是新建实例,被复制的实例是我们所称的原型对象,这个原型是可定制的。  2、原理  有两部分组成,抽象原型和具体原型。意图:用原型...

    实例讲解C++编程中对设计模式中的原型模式的使用

    原型模式的实现完整代码示例(code):原型模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用 C++实现,并在 VC 6.0 下测试运行)。 代码片断 1:Prototype.h //Prototype.h...

    PHP设计模式之原型模式定义与用法详解

    本文实例讲述了PHP设计模式之原型模式定义与用法。分享给大家供大家参考,具体如下: 原型设计模式(Prototype Design Pattern)很有意思, 因为它使用了一种克隆技术来复制实例化的对象. 新对象是通过复制原型实例来...

    设计模式(十)之原型模式.zip

    原型模式:就是从一个对象再创建另一个可定制的对象,而且不需要知道任何创建的细节。 重写抽象类中的Clone方法或者重写ICloneable中的Clone方法。 也就是说:要实现克隆的这个类,必须实现其Clone方法。

    JavaScript设计模式之原型模式(Object.create与prototype)介绍

    原型模式说明 说明:使用原型实例来 拷贝 创建新的可定制的对象;新建的对象,不需要知道原对象创建的具体过程; 过程:Prototype =&gt; new ProtoExam =&gt; clone to new Object; 使用相关代码: 代码如下: function ...

    GOF23之原型模式

    通过New产生一个对象需要非常繁琐的数据准备或者访问权限,则可以使用原型模式 二、优点: 1、效率高,避免了重新执行构造过程步骤 2、ProtoType类似New,但不同于New,克隆出的对象属性值与原型对象相同,克隆出的...

    关于JS中prototype的理解

    1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展。我们称B的原型为A。 2 javascript的方法可以分为三类: a 类...

    PHP设计模式之原型设计模式原理与用法分析

    PHP有一个内置的克隆方法__clone()可以在设计模式中使用,但是不能直接访问,使用clone关键字即可。克隆不会启动构造函数。 二、什么时候使用原型设计模式 如果一个项目要求你创建某个原型对象的多个实例,就可以...

    java设计模式

    13.3.2 原型模式的使用场景 13.4 原型模式的注意事项 13.4.1 构造函数不会被执行 13.4.2 浅拷贝和深拷贝 13.4.3 clone与final两个冤家 13.5 最佳实践 第14章 中介者模式 14.1 进销存管理是这个样子的吗? 14.2 中介...

    git clone 最新版

    git clone 最新版 不多说上资源 好用测试ok git clong git clone 最新版 不多说上资源 好用测试ok git clong

    java Clone

    Clone 属性的相关内容 Clone 属性的相关内容

    typescript-prototype:TypeScript原型

    $ git clone https://github.com/bilardi/typescript-prototype 或者您可以通过npm安装: $ npm install simple-sample 用法 阅读文件中的单元测试以使用它。这是最佳做法。 import { MyClass } from 'simple-...

    Jlink V8固件升级提示Clone的解决方法!

    在使用高版本版KEIL时,提示要升级固件,升级后就出现JLINK is Clone的提示!“the emulator is JLink-Clone, the segger software only support orginal segger device” 然后闪退,IDE崩溃关闭! 解决方案: 1....

Global site tag (gtag.js) - Google Analytics