扫码关注官方订阅号
84669人学习
65727人学习
82984人学习
467778人学习
498837人学习
471966人学习
256484人学习
152542人学习
224170人学习
139536人学习
81804人学习
85022人学习
11944人学习
20001人学习
60816人学习
5487人学习
15007人学习
2150人学习
6980人学习
194925人学习
359900人学习
1142人学习
19058人学习
3206人学习
180550人学习
48569人学习
17603人学习
40936人学习
1049人学习
750人学习
32909人学习
本篇文章给大家带来的内容是关于php原型模式的实现方法及介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
平行继承层次的出现是工厂方法模式带来的一个问题。这是一种让一些程序员不舒服的耦合。每次添加产品家族时,你就被迫去创建一个相关的具体创建者。在一个快速增长的系统里会包含越来越多的产品,而维护这种关系便会很快令人厌烦。避免这种依赖的办法是使用PHP的 clone关键词复制已存在的具体产品,然后,具体产品类本身便成为它们自己生成的基础。这使是原型模式。使用该模式我们可以用组合代替继承。这样的转变则促进了代码运行时的灵活性,并减少了必须创建的类的数。
假设有一款“文明”( Civilization)风格的网络游戏,可在区块组成的格子中操作战斗单元(unit)。每个区块分别代表海洋、平原和森林。地形的类别约束了占有区块的单元的格斗能力。我们可以有一个 errainFactory对象来提供Sea、 Forest和 Plains.对象,我们决定允许用户在完全不同的环境里选择,于是Sea可能是 Marssea和 Earthsea的抽象父类。 Forest(森林)和P1ains(平原)对象也会有相似的实现。这里的分支便构成了抽象工厂模式。我们有截然不同的产品体系(Sea、 Plains、 Forests),而这些产品家族间有超越继承的紧密联系,如 Earth(地球)和Mars(火星),它们都同时存在海洋、森林和平原地形。图9-10所示的类图展示了如何对这些产品应用抽象工厂和工厂方法模式。
你可以看到,我们依赖继承来组合工厂生成的 terrain(地形)家族产品,这的确是一个可行的解决方案,但这需要有一个大型的继承体系,并且相对来说不那么灵活。当你不想要平行的集成体系而需要最大化运行时的灵活性时,可以使用抽象工厂模式的强大变形一原型模式
<?php //海洋 class Sea{ //可导航性 private $navigability=0; function __construct($navigability){ $this->navigability=$navigability; } } //地球海洋 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 $forest; private $plains; 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; } } class Contained{} class Container{ public $contained; function __construct(){ $this->cOntained=new Contained(); } function __clone(){ //确保被克隆的对象持有的是self::$contained的克隆而不是引用 $this->cOntained=clone $this->contained; } } $factory=new TerrainFactory(new EarthSea(-1), new EarthPlains(), new EarthForest()); print_r($factory->getSea()); print "<hr>"; print_r($factory->getPlains()); print "<hr>"; print_r($factory->getForest());
输出结果:
EarthSea Object ( [navigability:Sea:private] => -1 )
EarthPlains Object ( )
EarthForest Object ( )
以上就是php原型模式的实现方法及介绍(附代码)的详细内容,更多请关注php中文网其它相关文章!
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
精品班
技术支持
技术咨询
学习群
会员优惠
返回顶部