资讯专栏INFORMATION COLUMN

PHP设计模式之原型模式

funnyZhang / 3015人阅读

摘要:原型模式是一种创建型设计模式,模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些

概念

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节。

工作原理

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

解决什么问题

它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。

角色

抽象原型(Prototype)角色:声明一个克隆自身的接口

具体原型(Concrete Prototype)角色:实现一个克隆自身的操作

结构图

代码 浅copy模式

直接copy,拷贝了源对象的引用地址等,所以原来内容变化,新内容变化。

name = $name;
    }

    public function setName($name)
    {
        $this->name=$name;
    }

    public function getName()
    {
        return $this->name;
    }

    /**
     * 拷贝自身
     *
     * @return ConcretePrototype 返回自身
     */
    public function copy()
    {
        return clone $this;//浅拷贝
    }
}

/**
 * 测试潜拷贝
 */

class LatentCopyDemo{
    public $array;
}

/**
 * Class Client 客户端
 */
class Client{

    /**
     * 测试方法
     */
    public static function test(){

        $demo = new LatentCopyDemo();
        $demo->array = array(1,2);

        $object1 = new ConcretePrototype($demo);
        $object2 = $object1->copy();

        var_dump($object1->getName());
        echo "
"; var_dump($object2->getName()); echo "
"; $demo->array = array(3, 4); var_dump($object1->getName()); echo "
"; var_dump($object2->getName()); echo "
"; } } Client::test();

运行结果

object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } 
object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } 
object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(3) [1]=> int(4) } } 
object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(3) [1]=> int(4) } } 
深拷贝模式

深copy通过序列化和反序列化完成copy,新copy的内容完全复制原来的内容。原来的内容变化,新内容不变。

name = $name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    /**
     * 拷贝自身
     *
     * @return ConcretePrototype 返回自身
     */
    public function copy()
    {
        $serialize_obj = serialize($this);
        $clone_obj = unserialize($serialize_obj);
        return $clone_obj;
    }
}

/**
 * 测试潜拷贝
 */

class DeepCopyDemo{
    public $array;
}

/**
 * Class Client 客户端
 */
class Client{

    /**
     * 测试方法
     */
    public static function test(){

        $demo = new DeepCopyDemo();
        $demo->array = array(1,2);

        $object1 = new ConcretePrototype($demo);
        $object2 = $object1->copy();

        var_dump($object1->getName());
        echo "
"; var_dump($object2->getName()); echo "
"; $demo->array = array(3, 4); var_dump($object1->getName()); echo "
"; var_dump($object2->getName()); echo "
"; } } Client::test();

运行结果

object(DeepCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } 
object(DeepCopyDemo)#4 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } 
object(DeepCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(3) [1]=> int(4) } } 
object(DeepCopyDemo)#4 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } 
优点和缺点 优点

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

缺点

Prototype模式的最主要缺点就是每一个类必须配备一个克隆方法。
而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事。

适用场景

当一个系统应该独立于它的产品创建、构成和表示时,要使用Prototype模式

当要实例化的类是在运行时刻指定时,例如动态加载

为了避免创建一个与产品类层次平等的工厂类层次时;

当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22050.html

相关文章

  • 优才公开课笔记:php设计模式 (四)原型模式

    摘要:继续分享设计模式的公开课,这是第四篇创建型模式之原型模式设计模式的一般介绍在第一篇文章讲了,不了解的可以先看看。设计模式的第一部分,创建型模式就总结完了。下面还有两部分结构型设计模式和行为型设计模式稍后继续。 继续分享设计模式的公开课,这是第四篇创建型模式之原型模式 设计模式的一般介绍在第一篇文章讲了,不了解的可以先看看。 原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这个...

    Maxiye 评论0 收藏0
  • 【面向对象的PHP模式原型

    摘要:原型模式平行的继承层次使用工厂模式在大型设计中,必须去维护大量的产品类。上文中,称之为特殊的耦合在这里我们介绍一种其抽象工厂模式的变体原型模式。面向对象设计模式目录 原型模式 平行的继承层次使用工厂模式在:大型设计中,必须去维护大量的产品类。(上文中,称之为特殊的耦合) 在这里我们介绍一种其抽象工厂模式的变体:原型模式。它使用clone关键词,来复制具体产品类,使得具体产品类能完成自我...

    Alan 评论0 收藏0
  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你的“对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    Lyux 评论0 收藏0
  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你的“对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    AaronYuan 评论0 收藏0
  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你的“对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    李昌杰 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<