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录入页面中动态从数据库中提取数据的实现
Oct 09 PHP
ADODB的数据库封包程序库
Dec 31 PHP
phpmyadmin 常用选项设置详解版
Mar 07 PHP
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
单点登录 Ucenter示例分析
Oct 29 PHP
php中autoload的用法总结
Nov 08 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
Nov 28 PHP
php中{}大括号是什么意思
Dec 01 PHP
php递归法读取目录及文件的方法
Jan 30 PHP
PHP错误Warning:mysql_query()解决方法
Oct 24 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
Nov 18 PHP
PHP7 mongoDB扩展使用的方法分享
May 02 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 #PHP
PDO实现学生管理系统
Mar 21 #PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
Mar 18 #PHP
YII2框架使用控制台命令的方法分析
Mar 18 #PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 #PHP
You might like
php 随机记录mysql rand()造成CPU 100%的解决办法
2010/05/18 PHP
php网站被挂木马后的修复方法总结
2014/11/06 PHP
php使用GD实现颜色渐变实例
2015/06/02 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
2017/05/20 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
JavaScript事件列表解说
2006/12/22 Javascript
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
JavaScript常用对象的方法和属性小结
2012/01/24 Javascript
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
JS对select控件option选项的增删改查示例代码
2013/10/21 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
js内置对象处理_打印学生成绩单的简单实现
2016/09/24 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
JS异步宏队列与微队列原理区别详解
2020/07/02 Javascript
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
Python叠加两幅栅格图像的实现方法
2019/07/05 Python
Python笔记之观察者模式
2019/11/20 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
如何实现一个自定义类的序列化
2012/05/22 面试题
护理职业应聘自荐书
2013/09/29 职场文书
开办大学饮食联盟创业计划书
2014/01/29 职场文书
中学生操行评语
2014/04/24 职场文书
幼儿园保育员随笔
2015/08/14 职场文书
mysql在项目中怎么选事务隔离级别
2021/05/25 MySQL
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python