`

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 Pattern

    ### 原型模式 Prototype Pattern #### 概述 原型模式是一种创建型设计模式,它允许用户通过复制现有的实例来创建新的对象,而不是通过传统的构造器来创建对象。这种模式适用于那些创建对象的成本较高,或者当对象...

    Prototype Pattern原型模式

    **原型模式(Prototype Pattern)**是一种基于克隆的创建型设计模式,它的主要目的是为了提高创建新对象的效率,特别是当创建新对象的过程复杂或者资源消耗较大时。在原型模式中,一个已经创建的对象(称为原型)被...

    c++-设计模式之原型模式(Prototype Pattern)

    原型模式(Prototype Pattern)是一种创建型设计模式,允许通过复制现有对象来创建新对象,而不是通过类构造器。这种模式常用于需要频繁创建相似对象的场景,能够提高性能并减少内存使用。 原型模式的组成 原型接口...

    创建型模式之原型模式(Prototype Pattern)

    **原型模式(Prototype Pattern)详解** 在软件设计中,原型模式是一种创建型设计模式,它提供了一种通过复制已有对象来创建新对象的方式,避免了重复的构造过程,提高了代码的效率和可维护性。原型模式的核心思想...

    [创建型模式]设计模之原型模式(Prototype Pattern)

    **原型模式(Prototype Pattern)**是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而不是通过构造函数或工厂方法。这种模式的核心在于,它提供了一种更高效、更灵活的方式来创建新实例,特别是在...

    原型设计模式prototype

    **原型设计模式(Prototype Pattern)**是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而不是通过构造函数来实例化新对象。在面向对象编程中,当我们需要频繁地创建具有相同或相似属性的对象时,...

    Prototype模式

    **原型模式(Prototype Pattern)**是一种创建型设计模式,它提供了一种通过复制已有对象来创建新对象的方式,而不是通过构造函数。在某些情况下,当创建新对象的成本非常高时(例如,对象需要大量的初始化操作或者从...

    设计模式之原型模式Java实现和类设计图

    原型模式(Prototype Pattern)是其中一种行为设计模式,主要用于对象创建。它通过复制已有对象来创建新对象,而不是通过传统的构造函数来创建。在Java中,原型模式可以有效地提高性能,特别是在创建复杂对象时。 #...

    .NET设计模式(6):原型模式(PrototypePattern)

    ### .NET设计模式(6):原型模式(Prototype Pattern) #### 概述 在软件工程领域,设计模式提供了一系列经过验证的解决方案,帮助开发者解决常见的软件设计问题。本篇文章聚焦于.NET框架下的“原型模式”...

    设计模式之原型模式

    **原型模式(Prototype Pattern)**是软件设计模式中的结构型模式之一,主要用来简化实例化过程,减少类的创建。在原型模式中,一个对象可以被用作创建其他新对象的模板,通过复制已有对象来创建新对象,而不是通过new...

    [创建型模式] 原型模式的理解

    原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。这种模式的核心在于,它提供了一种更灵活的创建对象的方式,避免了复杂的构造过程...

    设计模式——原型模式

    原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。这种模式的核心在于,它提供了一种对象克隆的简便方法,使得对象的创建过程对用户...

    设计模式的原型模式的例子

    原型模式(Prototype Pattern)是软件设计模式中的一种结构型模式,它的主要目的是通过复制已有对象来创建新对象,从而减少创建新对象的成本。在原型模式中,类的实例化过程被替换为对已有实例的克隆操作,尤其适用...

    android设计模式之原型模式

    本文将深入探讨Android设计模式中的“原型模式”(Prototype Pattern),并结合提供的"prototype"压缩包中的示例代码进行解析。 原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而...

    PHP设计模式(四)原型模式Prototype实例详解【创建型】

    原型模式(Prototype Pattern)属于创建型设计模式的一种,它允许我们创建具有相同特性的对象,而不必直接通过构造函数来实例化对象。原型模式在PHP中主要通过clone关键字来实现,当我们需要一个与某个已存在对象...

    C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)

    今天我们将深入探讨其中的一种创建型模式——原型模式(Prototype Pattern)。原型模式主要用于简化实例化过程,通过克隆已有对象来创建新对象,而不是每次都创建全新的实例。在C#中,我们可以通过实现`ICloneable`...

    ava常用设计模式-原型模式

    原型模式(Prototype Pattern)是一种创建型设计模式,允许通过复制现有对象来创建新对象,而不是通过实例化类来创建新对象。在需要创建大量相似对象时非常有用,它可以避免重复创建对象,从而提高性能,并且可以...

    java设计模式之原型模式

    原型模式(Prototype Pattern)是设计模式中的一种结构型模式,主要用于快速创建对象。在Java中,它基于对象克隆的概念,允许我们复制已有对象而不必再次创建新实例,从而降低系统内存开销并提高性能。原型模式的...

Global site tag (gtag.js) - Google Analytics