博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【面向对象的PHP】之模式:原型
阅读量:6975 次
发布时间:2019-06-27

本文共 2067 字,大约阅读时间需要 6 分钟。

原型模式

平行的继承层次使用工厂模式在:大型设计中,必须去维护大量的产品类。(上文中,称之为“特殊的耦合”)

在这里我们介绍一种其抽象工厂模式的变体:原型模式。它使用clone关键词,来复制具体产品类,使得具体产品类能完成自我复制。

(通俗介绍:工场只负责生产产品,选择生产何等产品,不再由工场自己决定,而是通过传参,来确认——对比抽象工厂,你可以发现,我们再也找不到一大群具体产品的创建者,而只有一个高度灵活的创建者)

问题

假设我们在做一款类似文明(Cicilization)的网页游戏——这么经典的游戏都没玩过?成何体统[滑稽]。(屠龙宝刀,点击就送!)

里面有个 战斗用途的地理系统——三种地形:海洋 Sea/平原 Forest/森林 Plains,按照抽象工厂 + 工厂模式,我们肯定可以得到这样的结果:

UML - StartUML

(为何我的眼里常含泪水,因为StartUML2.5难用的深沉)

但我们要避免“大型的继承体系”——开头说了,这会造成另类耦合,于是,来看看原型模式的解决方法吧!

实现

class Sea {}class EarthSea extends Sea {}class MarsSea extends Sea {}class Plains {}class EarthPlains extends Plains {}class MarsPlains extends Plains {}class Forest {}class EarthForest extends Forest {}class MarsForest extends Forest {}class TerrainFactory {    private $sea;    private $plains;    private $forest;    function __construct( Sea $sea, Plains $plains, Forest $forest )    {        $this->sea = $sea;        $this->plains = $plains;        $this->forest = $forest;    }    function getSea() {        return clone $this->sea;    }    function getPlains() {        return clone $this->plains;    }    function getForest() {        return clone  $this->forest;    }}$factory = new TerrainFactory(    new EarthSea(),    new EarthPlains(),    new EarthForest());print_r( $factory->getSea() );print_r( $factory->getPlains() );print_r( $factory->getForest() );

读完代码,你就能看懂原型模式,创造者可以无脑的生产出一片“具备三种地形的战斗区域”,你在地球风格的海洋和森林。火星风格的平原上战斗?那么只需要传递三个对应参数即可,换而言之——创造者不再负责:我要造什么。

我们还可以增加一些灵活性,譬如:海洋地形中的航行难度——营造出一种“索马里海域 / 渤海海域”的差异(在古代,索马里海域的航船条件相当凶恶)。

class Sea {    private $navigability = 0;    function __construct( $navigability )    {        $this->navigability = $navigability;    }}...省略部分代码...$factory = new TerrainFactory(    new EarthSea( -1 ),    new EarthPlains(),    new EarthForest());

可以预见,这是多么具备灵活性的模式。额外提及:如果产品类包含了其他外部类,记得采用__clone()方法,这样可以保证你得到的是深度复制(deep copy)

模式的诱导性

本节没有结论(或者,这个模式很好理解),这里提及一个模式的诱导和骗术:它们并没有帮你决定Create Who?

无论是工厂模式、抽象工厂模式,亦或是原型模式,它们都只是在技术层面简化了类的数量、维护复杂度。

你还是需要自己决定:生产特定的产品——你会将这些决定留在整个代码系统,在你需要修改一处时,造成瘫痪。

解决方案:操控单例类 / 存储于数据库 / 甚至直接写到配置文件(.htaccess等)——包含大量的标记/硬编码;

个人推荐:单例类 + 配置文件,优点:方便修改、全局访问

()

转载地址:http://fnrsl.baihongyu.com/

你可能感兴趣的文章
学习hadoop需要什么基础
查看>>
Linux上安装常用软件 & window 管理Linux工具
查看>>
iview-admin运行步骤
查看>>
原生表格组件--GridManager
查看>>
面试阿里,我还是挂在了第四轮……
查看>>
面试官:说说Java线程的生命周期
查看>>
5分钟从零构建第一个 Apache Flink 应用
查看>>
按钮代码 带注释
查看>>
springBoot + KISSO实现单点登录
查看>>
Promise面试题
查看>>
HA高可用
查看>>
轻松了解EOS
查看>>
数据结构与算法-day6-跳表
查看>>
JVM学习笔记——程序计数器
查看>>
【国际IT专场】每个程序猿必须且一定要懂的“数据库索引
查看>>
正则表达式基本用法
查看>>
JS中的继承模式
查看>>
生命周期组件 Lifecycle 源码解析(一)
查看>>
TNW-获取微信公众号的 access_token
查看>>
广州,后会有期
查看>>