原型模式通过复制已经存在的实例来返回新的实例,而不是新建实例,并且原型(被复制的实例)是可定制的;原型模式多用于创建复杂的或耗时的实例,这种情况下,复制一个已经存在的实例是程序运行更高效无疑是一种好办法;

概述:

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式是一种创建型设计模式,原型设计模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节;

工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。


适用性:
当要实例化的类是在运行时刻指定时,例如,通过动态装载;
为了避免创建一个与产品类层次平行的工厂类层次时;
当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。


优点:
1、可以在运行时刻增加和删除产品
2、可以改变值或结构以指定新对象
3、减少子类的构造
4、用类动态配置应用

缺点:
原型设计模式是的最主要的缺点就是每一个类必须包含一个克隆方法;
而且这个克隆方法需要对类的功能进行检测,这对于全新的类来说较容易,但对已有的类进行改造时将不是件容易的事情;


使用场景:

1、资源优化场景。

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

3、性能和安全要求的场景。

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

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

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


代码示例:

/**
* 原型模式
* 用原型实例指定创建对象的种类.并且通过拷贝这个原型来创建新的对象
*/
abstract class Prototype {
    private $_id = null;
    public function __construct($id) {
        $this->_id = $id;
    }
    public function getID() {
        return $this->_id;
    }
    public function __clone(){
        $this->_id += 1;
    }
    public function getClone() {
        return clone $this;
    }
}
class ConcretePrototype extends Prototype
{
}
//
$objPrototype = new ConcretePrototype(0);
$objPrototype1 = clone $objPrototype;
echo $objPrototype1->getID()."
";
$objPrototype2 = $objPrototype;
echo $objPrototype2->getID()."
";
$objPrototype3 = $objPrototype->getClone();
echo $objPrototype3->getID()."
";


参考:

http://www.lai18.com/content/373847.html

http://www.runoob.com/design-pattern/prototype-pattern.html

http://blog.sina.com.cn/s/blog_6dbbafe001018vcy.html