php中的原型模式

一、原型模式定义:

php中可使用clone关键词复制已经存在的具体产品。然后具体产品类本身便成为它们生成自己的基础。这就是原型模式。使用该模式我们可能用组合代替继承。这种的转变则促进了代码运行的灵活性,并减少了必须创建的类。

二、本节课的问题:

假设有一块“文明”风格的网络游戏,可在区块组成的格子里操作战斗单元。每个区块分别代表海洋、平原和森林。地形的类别约束了占有单元的移动和格斗能力。我们可以使用TerrainFactory对象来提供Sea、Forest和Plains对象,我们决定允许用户在完全不同的环境里选择,于是Sea可能是MarsSea和EarthSea的抽象父类。Forest和Plains对象也会有相似的实现。这里的分支便构成了抽象工厂模式(两个产品树,三个产品族)。我们有截然不同的产品体系(Sea、Forest和Plains),而这些产品家庭间有超越继承的紧密关系,如Earth和Mars,它们都有海洋、平原和森林地址。使用抽象工厂模式的确是个解决方案,但是如果我们不想要平行的继承体系而需要更大的灵活性时,可以使用抽象工厂模式的强大变形---原型模式。

三、引入原型模式:

当用不用工厂模式和抽象工厂模式时,必须决定使用哪个具体的创建者,这很可能是通过检查配置的值来决定的。既然这么做,为何不创建一个保存具体产品的工厂类,并在初始化时引入呢?这样不仅可以减少类的数量,还有其它好处,下面是原型模式的简单代码:

class Sea {}
class MarsSea extends Sea {}
class EarthSea extends Sea {}

class Forest {}
class MarsForest extends Forest {}
class EarthForest extends Forest {}

class Plains {}
class MarsPlains extends Plains {}
class EarthPlains extends Plains {}

class TerrainFactory {
    private $sea;
    private $forest;
    private $plains;

    public function __construct( Sea $sea, Forest $forest, Plains $plains )
    {
        $this->sea = $sea;
        $this->forest = $forest;
        $this->plains = $plains;
    }

    public function getSea()
    {
        return $this->sea;
    }

    public function getForest()
    {
        return $this->forest;
    }

    public function getPlains()
    {
        return $this->Plains;
    }
}

$factory = new TerrainFactory(new EarthSea(), new EarthForest(), new Plains());
print_r($factory->getSea());
print_r($factory->getForest());
print_r($factory->getPlains());

可以看到我们加载了一个带有产品对象实例的具体的TerrainFactory对象。客户端调用getSea方法时,返回在初始化时缓存的Sea对象的副本。这段代码相比于抽象工厂实现方法有个明显好处:如果想要一个类似地球和森林并有类似火星平原的星球上玩游戏呢,抽象工厂需要重新创建一个创建者类,而原型模式只需要改变添加到时TerrainFactory的参数即可。因此原型模式使我们利用组合所提供的灵活性,但是不单单如此,如果想生成的对象是由其它对象组成的,那么我们可以初始化时添加不同参数获取到想要的对象。如下:

$factory = new TerrainFactory(new EarthSea(1), new EarthForest(), new EarthPlains());

上面组EarthSea传递的参数可以为指定核心属性,也可以是内部组合的对象,比如FishResource(海洋中的鱼资源,可转换成金币,供购买东西),这样更利于我们扩展。

总结:原型模式的核心就是有一个组合多个对象的创建者类,这个创建者是通过克隆来生成新的对象的,这和工厂模式的区别很大,也是原型模式的核心。

好了,原型模式的笔记到此结束,目前理解还不够深刻,我会持续修改和完善。文笔拙劣,望各位看官,手下留情。谢谢。

时间: 2024-11-08 18:23:28

php中的原型模式的相关文章

浅谈JavaScript中的原型模式

在JavaScript中创建对象由很多种方式,如工厂模式.构造函数模式.原型模式等: <pre name="code" class="html">//工厂模式 function createPerson(name,age,job) { var o = new Object; o.name = name; o.age = age; o.job = job; o.sayName = function() { alert(this.name); } retur

spring中的原型模式

大家好,我原本是神剑山庄的铸剑师,名叫小赵,本来干的好好的,后来一时兴起,睡了三少爷的小姨子,与其一直提心吊胆,干脆来个逃之夭夭. 但是,我也要吃饭的呀,工作也得找,神剑山庄去不得,还有断剑山庄.藏剑山庄.荡剑山庄.等等等等大型企业,说不定这次跳槽,能跳出个飞黄腾达! 为了提高我投简历的准确性,我觉得简历要写的多样化,不能全写一模一样,比如说我的期望薪资不能写成一样,因为我希望能够根据目标企业的情况来投递合适薪资的简历,这样中标概率大一点. 这是我的简历类: public class Resum

理解javascript中的原型模式

一.为什么要用原型模式. 早期采用工厂模式或构造函数模式的缺点:  1.工厂模式:函数creatPerson根据接受的参数来构建一个包含所有必要信息的person对象,这个函数可以被无数次的调用,工厂模式尽管解决了创建多个相似对象的问题,却没有解决对象识别的问题(返回的是自定义的一个对象o,不明确对象o的类型).  2. 构造函数模式:构造函数的调用和其他oo语言一样,用new操作符来构建一个Person的实例:javascript中的构造函数也是函数(所以也可以直接像普通函数那样直接调用方法名

23种设计模式中的原型模式

原型模式:通过复制现有实例来创建新的实例,无须知道相应类的信息. 个人见解:在大量循环时,需要初始化对象,用 原型模式能节省大量的初始化所花费的时间,值得一谈的是浅复制和深复制 浅复制:Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组.容器对象.引用对象等都不会拷贝 代码 在这里我定义了一个学生类Student.java public class Student implements Cloneable { private String name; public Stude

JS中的原型模式

创建一个对象,先来看一段代码: // 例如创建一个 Person 的构造函数, 让人有名字, 可以说话 function Person ( name ) { this.name = name; // 可以说话, 需要有一个方法 this.sayHello = function () { console.log( '你好, 我是 ' + this.name ); }; } var p1 = new Person( '小明' ); var p2 = new Person( '大伟' ); conso

[工作中的设计模式]原型模式prototype

一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.prototype.run=function(){ alert(this.name+" is running"; } 此处的原型是js的特殊定义,在原型上定义的属性和方法所有的类进行共享. 不过设计模式中的原型模式指的是:将已有的对象作为原型,拷贝出一份具有相同属性的新的对象. 模式定义为:原型

Android开发中无处不在的设计模式——原型模式

不知不觉这个系列已经写了三篇了,其实很早之前就想写设计模式了,只不过怕自己误人子弟没有提笔去写.后来在实际开发中,发现设计模式可以让一个开发人员融会贯通所学的知识,为了进一步巩固自己,就写下了这一些列文章.前面介绍了三个模式. Android开发中无处不在的设计模式--单例模式 Android开发中无处不在的设计模式--Builder模式 Android开发中无处不在的设计模式--观察者模式 本篇文章介绍的模式其实很简单,即原型模式,按照惯例,先看定义. 用原型实例指定创建对象的种类,并通过拷贝

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

1.初识原型模式 大家都知道连锁机构是现在灰常流行的商业模式,比如咖啡之翼,那么假设咖啡之翼要在长春新建立一个分店,所经营的产品和以前在其他的城市已经存在的店经营的产品差不多,那么面向对象开发的角度怎么解决这个问题呢?难道要重新的实例化一个咖啡之翼的店??这显然不太好吧,咖啡之翼里面经营的产品(假设是属性吧)都需要重新写,这就是在做大量的重复工作啊,这显然是不符合OO开发思想的.遇到这样的情况,并不是重新建立一个类来解决这样的问题,而是通过设计模式中的"原型模式"来解决这种问题.是这种

设计模式(创建型)之原型模式(Prototype Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! 概述 原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据. 原型模式要求对象实现一个可以"克隆"自身的接口,这样就可以通过