php设计模式之原型模式分析【星际争霸游戏案例】


Posted in PHP onMarch 23, 2020

本文实例讲述了php设计模式之原型模式。分享给大家供大家参考,具体如下:

我们一般用new来新增对象,不过很多时候新增一个对象需要一些工作。而星际里面往往会新增某些类的大量的对象,比如新增很多机枪兵和龙骑。

待解决的问题:我们能否减少new的使用,同时避免需要新增对象的时候,了解对象的类名。

思路:php5提供了克隆方法,我们可以新增一个对象,然后每次需要新增和她同类的对象,克隆他就可以了。

原型(Prototype)模式示例:

<?php
  //机枪兵类
  class Marine
  {
    //所属的用户ID
    public $playerID

    //构造函数,参数为用户的id
    public function __construct($id)
    {
      $this->playerID = $id;
    }
  }

  //兵种的管理类
  class TroopManager
  {
    //数组,用于存放多个兵种的原型
    public $troopPrototype = array();

    //增加原型,第一个参数为原型的名字,第二个参数为原型对象
    public function addPrototype($name, $prototype)
    {
      $this->troopPrototype[$name] = $prototype;
    }

    //获取原型的克隆,也就是替代new的方法,参数为原型的名字
    public function getPrototype($name)
    {
      return clone $this->troopPrototype[$name];
    }
  }

  //初始化兵种的管理类
  $manager = new TroopManager();

  //初始化两个属于不同玩家的机枪兵的原型
  $m1 = new Marine(1);
  $m2 = new Marine(2);

  //增加原型,同时用比较容易记忆的名字来命名原型
  $manager->addPrototype('Marine of 1', $m1);
  $manager->addPrototype('Marine of 2', $m2);

  //当需要新增对象的时候,我们可以不必知道对象的类名和初始化的工作
  $m3 = $manager->getPrototype('Marine of 1');
?>

用途总结:原型模式可以将新增对象的工作细节封装。

实现总结:需要一个原型管理类,实现增加和获取克隆原型的方法。注意这里由于为了简明,省略了一些东西,实际上我们可以在克隆方法上做一些改动,也可以用接口规范每个原型类。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP iconv 解决utf-8和gb2312编码转换问题
Apr 12 PHP
php empty()与isset()区别的详细介绍
Jun 17 PHP
php实例分享之二维数组排序
May 15 PHP
PHP中让curl支持sock5的代码实例
Jan 21 PHP
phpMyAdmin安装并配置允许空密码登录
Jul 04 PHP
php生成图片验证码-附五种验证码
Aug 19 PHP
再推荐十款免费的php开发工具
Nov 09 PHP
盘点PHP和ASP.NET的10大对比!
Dec 24 PHP
YII Framework框架教程之安全方案详解
Mar 14 PHP
PHP实现动态执行代码的方法
Mar 25 PHP
Laravel 5.3 学习笔记之 配置
Aug 28 PHP
php curl中gzip的压缩性能测试实例分析
Nov 08 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 #PHP
PHP中关于php.ini参数优化详解
Feb 28 #PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 #PHP
php 的多进程操作实践案例分析
Feb 28 #PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
Feb 28 #PHP
php的无刷新操作实现方法分析
Feb 28 #PHP
php下的原生ajax请求用法实例分析
Feb 28 #PHP
You might like
为PHP初学者的8点有效建议
2010/11/20 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
jQuery+PHP打造滑动开关效果
2014/12/16 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
浅谈javascript中的call、apply、bind
2016/03/06 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
JavaScript获取服务器端时间的方法
2016/11/29 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
JS+CSS实现网页加载中的动画效果
2017/10/27 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
python获取指定网页上所有超链接的方法
2015/04/04 Python
Python中转换角度为弧度的radians()方法
2015/05/18 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
Python3基于sax解析xml操作示例
2018/05/22 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
HTML5语义化元素你真的用对了吗
2019/08/22 HTML / CSS
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
数据库专业英语
2012/11/30 面试题
50岁生日感言
2014/01/23 职场文书
小学教学随笔感言
2014/02/26 职场文书
司法助理专业自荐书
2014/06/13 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android
关于springboot 配置date字段返回时间戳的问题
2021/07/25 Java/Android
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server