美文网首页
PHP设计模式(六)-原型模式

PHP设计模式(六)-原型模式

作者: EwanRenton | 来源:发表于2018-07-26 16:35 被阅读0次

layout: post
title: "PHP设计模式(六)-原型模式"
date: 2016-06-07 10:22:51 +0800
comments: true
categories: [php]


1、模式定义

通过创建原型使用克隆方法实现对象创建而不是使用标准的new 方式。

2、UML类图

image

3、示例代码

<?php

    namespace DesignPatterns\Creational\Prototype;
    
    /**
     * BookPrototype类
     */
    abstract class BookPrototype
    {
        /**
         * @var string
         */
        protected $title;
    
        /**
         * @var string
         */
        protected $category;
    
        /**
         * @abstract
         * @return void
         */
        abstract public function __clone();
    
        /**
         * @return string
         */
        public function getTitle()
        {
            return $this->title;
        }
    
        /**
         * @param string $title
         */
        public function setTitle($title)
        {
            $this->title = $title;
        }
    }
    <?php
    
    namespace DesignPatterns\Creational\Prototype;
    
    /**
     * BarBookPrototype类
     */
    class BarBookPrototype extends BookPrototype
    {
        /**
         * @var string
         */
        protected $category = 'Bar';
    
        /**
         * empty clone
         */
        public function __clone()
        {
        }
    }
    <?php
    
    namespace DesignPatterns\Creational\Prototype;
    
    /**
     * FooBookPrototype类
     */
    class FooBookPrototype extends BookPrototype
    {
        protected $category = 'Foo';
    
        /**
         * empty clone
         */
        public function __clone()
        {
        }
    }

4、测试代码

    <?php
    
    namespace DesignPatterns\Creational\Prototype\Tests;
    
    use DesignPatterns\Creational\Prototype\BookPrototype;
    use DesignPatterns\Creational\Prototype\FooBookPrototype;
    use DesignPatterns\Creational\Prototype\BarBookPrototype;
    
    /**
     * PrototypeTest tests the prototype pattern
     */
    class PrototypeTest extends \PHPUnit_Framework_TestCase
    {
        //实例化得到类的原型
         public function getPrototype(){
             return array(
                 array(new FooBookPrototype()),
                 array(new BarBookPrototype())
             );
         }
    
         /**
          * 克隆类
          * @dataProvider getPrototype
          */
         public function testCreation(BookPrototype $prototype)
         {
             $book = clone $prototype;
             $book->setTitle($book->getCategory().' Book');
             $this->assertInstanceOf('DesignPatterns\Creational\Prototype\BookPrototype', $book);
         }
    } 

5、总结

原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是用对象内部提供的克隆方法,通过该方法返回一个对象的副本,这种创建对象的方式,相比我们之前说的几类创建型模式还是有区别的,之前的讲述的工厂方法模式与抽象工厂都是通过工厂封装具体的 new 操作的过程,返回一个新的对象,有的时候我们通过这样的创建工厂创建对象不值得,特别是以下的几个场景,可能使用原型模式更简单、效率更高:

  • 如果说我们的对象类型不是刚开始就能确定,而是在运行时确定的话,那么我们通过这个类型的对象克隆出一个新的类型更容易。
  • 有的时候我们可能在实际的项目中需要一个对象在某个状态下的副本,这个前提很重要,这点怎么理解呢,例如有的时候我们需要对比一个对象经过处理后的状态和处理前的状态是否发生过改变,可能我们就需要在执行某段处理之前,克隆这个对象此时状态的副本,然后等执行后的状态进行相应的对比,这样的应用在项目中也是经常会出现的。
  • 当我们处理的对象比较简单,并且对象之间的区别很小,可能只是很固定的几个属性不同的时候,使用原型模式更合适。

相关文章

  • PHP设计模式(六)-原型模式

    layout: posttitle: "PHP设计模式(六)-原型模式"date: 2016-06-07 10:2...

  • PHP完整实战23种设计模式

    前言 设计模式是面向对象的最佳实践 实战 PHP实战创建型模式 单例模式 工厂模式 抽象工厂模式 原型模式 建造者...

  • JavaJavascript基础进阶(十七)JS中常用的设计模式

    单利设计模式、构造原型设计模式、发布订阅设计模式、promise设计模式 单利模式 构造原型设计模式 最贴近OOP...

  • Java 十一种设计模式深入理解

    目录一、工厂设计模式二、抽象工厂模式三、单例设计模式四、建造者(Builder)模式五、原型模式六、适配器设计模式...

  • PHP 设计模式---原型模式

    原型模式(Prototype Pattern):与工厂模式类似,都是用来创建对象的。利用克隆来生成一个大对象,减少...

  • php设计模式——原型模式

    原型模式 概念理解:原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。适用于大对象的创建,...

  • PHP设计模式:原型模式

    前言 原型模式用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价...

  • PHP设计模式-原型模式

    适用性 原型设计模式创建对象的方式是复制和克隆初始对象或原型,这种方式比创建新实例更为有效。 UML MyOjec...

  • PHP 完整实战23种设计模式

    PHP实战创建型模式 单例模式 工厂模式 抽象工厂模式 原型模式 建造者模式 PHP实战结构型模式 桥接模式 享元...

  • Spring 准备内容

    准备内容 原型设计模式 PropotypeModle 原型模式也属于创造型设计模式,用原型实例指定创建对象的种类,...

网友评论

      本文标题:PHP设计模式(六)-原型模式

      本文链接:https://www.haomeiwen.com/subject/kuibmftx.html