php设计模式 -- 原型模式

原型模式(Prototype Pattern):与工厂模式类似,都是用来创建对象的。利用克隆来生成一个大对象,减少创建时的初始化等操作占用开销

(一)为什么需要原型模式

1,有些时候,我们需要创建多个类似的大对象。如果直接通过new对象,开销很大,而且new完还得进行重复的初始化工作。可能把初始化工作封装起来的,但是对于系统来说,你封不封装,初始化工作还是要执行。,

2,原型模式则不同,原型模式是先创建好一个原型对象,然后通过clone这个原型对象来创建新的对象,这样就免去了重复的初始化工作,系统仅需内存拷贝即可。

缺点

Prototype是的最主要的缺点就是每一个类必须包含一个克隆方法;

而且这个克隆方法需要对类的功能进行检测,这对于全新的类来说较容易,但对已有的类进行改造时将不是件容易的事情;

要点

1、构建一个原型对象

2、对其进行初始化

3、对原型对象进行克隆操作

代码示例

<?php
/**
 * PHP设计模式 原型模式(prototype)
 * User: pyzn
 * Date: 2016-03-22
 * Time: 14:08
 */

/**
 * Class Object
 * 一个结构复杂的对象原型
 */
class Object
{
    public function init()
    {
        //一些很占用系统资源的操作
    }

    public function run()
    {

    }

}

//常规方式
$obj1 = new Object();
$obj1->init();
$obj1->run();

$obj2 = new Object();
$obj2->init();
$obj2->run();

//原型模式
$prototype = new Object();
$prototype->init();

$obj1 = clone $prototype;
$obj1->run();

$obj2 = clone $prototype;
$obj2->run();

复杂实现

/**
 * PHP设计模式 原型模式(prototype)的复杂实现
 * User: pyzn
 * Date: 2016-03-22
 * Time: 14:08
 */

/**
 * Interface IPrototype
 * 声明一个克隆自身的接口,对原型角色的抽象
 */
interface IPrototype
{
    public function copy();
}

class PrototypeObject implements IPrototype
{
    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()
    {
        /*
         * 浅copy
         */
        //return clone $this;

        /*
         * 深copy
         */
        $serializeStr = serialize($this);
        $cloneObj = unserialize($serializeStr);

        return $cloneObj;
    }
}


class Client
{
    public static function main()
    {
        $prototype = new PrototypeObject("test");

        $pro1 = $prototype->copy();
        $pro2 = $prototype->copy();

        $pro2->setName("test2");

        var_dump($pro1);
        var_dump($pro2);
    }
}

Client::main();

object(PrototypeObject)#2 (1) {
  ["name":"PrototypeObject":private]=> string(5) "test" }
object(PrototypeObject)#3 (1) {
  ["name":"PrototypeObject":private]=> string(4) "test2" }
原文地址:https://www.cnblogs.com/mmmzh/p/10102323.html