PHP设计模式 原型模式(Prototype)

定义

和工厂模式类似,用来创建对象。但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建。

场景

大对象的创建。

优点

1、可以在运行时刻增加和删除产品

2、可以改变值或结构以指定新对象

3、减少子类的构造

4、用类动态配置应用

缺点

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)_第1张图片

/**
 * 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();

你可能感兴趣的:(PHP设计模式 原型模式(Prototype))